iOS开发之ios常用数据库、完美无缺
白羽 2018-07-16 来源 :网络 阅读 952 评论 0

摘要:本文将带你了解iOS开发之ios常用数据库、完美无缺,希望本文对大家学IOS有所帮助。



ios常用数据库
  
  
    
直接copy过去就能用,我们不用再去造轮子,现在的xocod9.4更加人性化了,不用再添加依赖库,这点苹果你让我开始喜欢了
 

 
[TestDBModel clearTable];  //清空数据库
    
    NSLog(@"前[TestDBModel findAll]=%@",[TestDBModel findAll]);
    NSArray *arr1 = @[@"哈哈",@"嘻嘻",@"呵呵"];
    
    
    NSMutableArray *mArr = [[NSMutableArray alloc] init];
    
    for (int i = 0; i < arr1.count; i++) {
        TestDBModel *test = [[TestDBModel alloc] init];
        test.name = arr1[i];
        if (i==1) {
            test.sexNum = 100;
            test.isDoctor = YES;
        }else{
            test.sexNum = i;
            test.isDoctor = NO;
        }
        [mArr addObject:test];
    }
    [TestDBModel saveObjects:mArr];
    
    
    
    
    NSLog(@"后[TestDBModel findAll]=%@",[TestDBModel findAll]);
 
 
===================1////  DBHelper.h//  Doctor////  Created by zrq on 15/10/8.//  Copyright © 2015年 zrq. All rights reserved.//
#import #import "FMDB.h"
@interface DBHelper : NSObject
@property (nonatomic, retain, readonly) FMDatabaseQueue *dbQueue;
+ (DBHelper *)shareInstance;
+ (NSString *)dbPath;
- (BOOL)changeDBWithDirectoryName:(NSString *)directoryName;
@end
===================2////  DBHelper.m//  Doctor////  Created by zrq on 15/10/8.//  Copyright © 2015年 zrq. All rights reserved.//
#import "DBHelper.h"#import "DBModel.h"#import @interface DBHelper()
@property (nonatomic, retain) FMDatabaseQueue *dbQueue;
@end
@implementation DBHelper
static DBHelper *_instance = nil;
+ (instancetype)shareInstance{    static dispatch_once_t onceToken ;    dispatch_once(&onceToken, ^{        _instance = [[super allocWithZone:NULL] init] ;    }) ;        return _instance;}
+ (NSString *)dbPathWithDirectoryName:(NSString *)directoryName{    NSString *docsdir = [NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES) lastObject];    NSFileManager *filemanage = [NSFileManager defaultManager];    if (directoryName == nil || directoryName.length == 0) {        docsdir = [docsdir stringByAppendingPathComponent:@"ZrqDB"];    } else {        docsdir = [docsdir stringByAppendingPathComponent:directoryName];    }    BOOL isDir;    BOOL exit =[filemanage fileExistsAtPath:docsdir isDirectory:&isDir];    if (!exit || !isDir) {        [filemanage createDirectoryAtPath:docsdir withIntermediateDirectories:YES attributes:nil error:nil];    }   // NSString *dbpath = [docsdir stringByAppendingPathComponent:[NSString stringWithFormat:@"D%@.sqlite",UDString(DOCTOR_ID)]];     NSString *dbpath = [docsdir stringByAppendingPathComponent:[NSString stringWithFormat:@"D255.sqlite"]];    return dbpath;}
+ (NSString *)dbPath{    return [self dbPathWithDirectoryName:nil];}
- (FMDatabaseQueue *)dbQueue{    if (_dbQueue == nil) {        _dbQueue = [[FMDatabaseQueue alloc] initWithPath:[self.class dbPath]];    }    return _dbQueue;}
- (BOOL)changeDBWithDirectoryName:(NSString *)directoryName{    if (_instance.dbQueue) {        _instance.dbQueue = nil;    }    _instance.dbQueue = [[FMDatabaseQueue alloc] initWithPath:[DBHelper dbPathWithDirectoryName:directoryName]];        int numClasses;    Class *classes = NULL;    numClasses = objc_getClassList(NULL,0);        if (numClasses >0 )    {        classes = (__unsafe_unretained Class *)malloc(sizeof(Class) * numClasses);        numClasses = objc_getClassList(classes, numClasses);        for (int i = 0; i < numClasses; i++) {            if (class_getSuperclass(classes[i]) == [DBModel class]){                id class = classes[i];                [class performSelector:@selector(createTable) withObject:nil];            }        }        free(classes);    }        return YES;}
+ (id)allocWithZone:(struct _NSZone *)zone{    return [DBHelper shareInstance];}
- (id)copyWithZone:(struct _NSZone *)zone{    return [DBHelper shareInstance];}
#if ! __has_feature(objc_arc)- (oneway void)release{    }
- (id)autorelease{    return _instance;}
- (NSUInteger)retainCount{    return 1;}#endif@end
===================3////  DBModel.h//  Doctor////  Created by zrq on 15/10/8.//  Copyright © 2015年 zrq. All rights reserved.//
#import /** SQLite五种数据类型 */#define SQLTEXT     @"TEXT"#define SQLINTEGER  @"INTEGER"#define SQLREAL     @"REAL"#define SQLBLOB     @"BLOB"#define SQLNULL     @"NULL"#define PrimaryKey  @"primary key"
#define primaryId   @"pk"
@interface DBModel : NSObject
/** 主键 id */@property (nonatomic, assign)   int        pk;/** 列名 */@property (retain, readonly, nonatomic) NSMutableArray         *columeNames;/** 列类型 */@property (retain, readonly, nonatomic) NSMutableArray         *columeTypes;
/** *  获取该类的所有属性 */+ (NSDictionary *)getPropertys;
/** 获取所有属性,包括主键 */+ (NSDictionary *)getAllProperties;
/** 数据库中是否存在表 */+ (BOOL)isExistInTable;
/** 表中的字段*/+ (NSArray *)getColumns;
/** 保存或更新 * 如果不存在主键,保存, * 有主键,则更新 */- (BOOL)saveOrUpdate;/** 保存单个数据 */- (BOOL)save;/** 批量保存数据 */+ (BOOL)saveObjects:(NSArray *)array;/** 更新单个数据 */- (BOOL)update;/** 批量更新数据*/+ (BOOL)updateObjects:(NSArray *)array;/** 删除单个数据 */- (BOOL)deleteObject;/** 批量删除数据 */+ (BOOL)deleteObjects:(NSArray *)array;/** 通过条件删除数据 */+ (BOOL)deleteObjectsByCriteria:(NSString *)criteria;/** 通过条件删除 (多参数)--2 */+ (BOOL)deleteObjectsWithFormat:(NSString *)format, ...;/** 清空表 */+ (BOOL)clearTable;
/** 查询全部数据 */+ (NSArray *)findAll;
/** 通过主键查询 */+ (instancetype)findByPK:(int)inPk;/** 通过条件查询 */+ (instancetype)findFirstWithFormat:(NSString *)format, ...;
/** 查找某条数据 */+ (instancetype)findFirstByCriteria:(NSString *)criteria;
+ (NSArray *)findWithFormat:(NSString *)format, ...;
/** 通过条件查找数据 * 这样可以进行分页查询 @" WHERE pk > 5 limit 10" */+ (NSArray *)findByCriteria:(NSString *)criteria;/** * 创建表 * 如果已经创建,返回YES */+ (BOOL)createTable;
#pragma mark - must be override method/** 如果子类中有一些property不需要创建数据库字段,那么这个方法必须在子类中重写 */+ (NSArray *)transients;
 
@end
===================4////  DBModel.m//  Doctor////  Created by zrq on 15/10/8.//  Copyright © 2015年 zrq. All rights reserved.//
#import "DBModel.h"#import #import "DBHelper.h"
@implementation DBModel
#pragma mark - override method+ (void)initialize{    if (self != [DBModel self]) {        [self createTable];    }}
- (instancetype)init{    self = [super init];    if (self) {        NSDictionary *dic = [self.class getAllProperties];        _columeNames = [[NSMutableArray alloc] initWithArray:[dic objectForKey:@"name"]];        _columeTypes = [[NSMutableArray alloc] initWithArray:[dic objectForKey:@"type"]];    }        return self;}
#pragma mark - base method/** *  获取该类的所有属性 */+ (NSDictionary *)getPropertys{    NSMutableArray *proNames = [NSMutableArray array];    NSMutableArray *proTypes = [NSMutableArray array];    NSArray *theTransients = [[self class] transients];    unsigned int outCount, i;    objc_property_t *properties = class_copyPropertyList([self class], &outCount);    for (i = 0; i < outCount; i++) {        objc_property_t property = properties[i];        //获取属性名        NSString *propertyName = [NSString stringWithCString:property_getName(property) encoding:NSUTF8StringEncoding];        if ([theTransients containsObject:propertyName]) {            continue;        }        [proNames addObject:propertyName];        //获取属性类型等参数        NSString *propertyType = [NSString stringWithCString: property_getAttributes(property) encoding:NSUTF8StringEncoding];        /*         各种符号对应类型,部分类型在新版SDK中有所变化,如long 和long long         c char         C unsigned char         i int          I unsigned int         l long         L unsigned long         s short        S unsigned short         d double       D unsigned double         f float        F unsigned float         q long long    Q unsigned long long         B BOOL         @ 对象类型 //指针 对象类型 如NSString 是@“NSString”                           64位下long 和long long 都是Tq         SQLite 默认支持五种数据类型TEXT、INTEGER、REAL、BLOB、NULL         因为在项目中用的类型不多,故只考虑了少数类型         */        if ([propertyType hasPrefix:@"T@"]) {            [proTypes addObject:SQLTEXT];        } else if ([propertyType hasPrefix:@"Ti"]||[propertyType hasPrefix:@"TI"]||[propertyType hasPrefix:@"Ts"]||[propertyType hasPrefix:@"TS"]||[propertyType hasPrefix:@"TB"]) {            [proTypes addObject:SQLINTEGER];        } else {            [proTypes addObject:SQLREAL];        }            }    free(properties);        return [NSDictionary dictionaryWithObjectsAndKeys:proNames,@"name",proTypes,@"type",nil];}
/** 获取所有属性,包含主键pk */+ (NSDictionary *)getAllProperties{    NSDictionary *dict = [self.class getPropertys];    //NSLog(@"该类所有属性:%@",[self.class getPropertys]);        NSMutableArray *proNames = [NSMutableArray array];    NSMutableArray *proTypes = [NSMutableArray array];    [proNames addObject:primaryId];    [proTypes addObject:[NSString stringWithFormat:@"%@ %@",SQLINTEGER,PrimaryKey]];    [proNames addObjectsFromArray:[dict objectForKey:@"name"]];    [proTypes addObjectsFromArray:[dict objectForKey:@"type"]];        //NSLog(@"%@",[NSDictionary dictionaryWithObjectsAndKeys:proNames,@"name",proTypes,@"type",nil]);    return [NSDictionary dictionaryWithObjectsAndKeys:proNames,@"name",proTypes,@"type",nil];}
/** 数据库中是否存在表 */+ (BOOL)isExistInTable{    __block BOOL res = NO;    DBHelper *jkDB = [DBHelper shareInstance];    [jkDB.dbQueue inDatabase:^(FMDatabase *db) {        NSString *tableName = NSStringFromClass(self.class);        res = [db tableExists:tableName];    }];    return res;}
/** 获取列名 */+ (NSArray *)getColumns{    DBHelper *jkDB = [DBHelper shareInstance];    NSMutableArray *columns = [NSMutableArray array];    [jkDB.dbQueue inDatabase:^(FMDatabase *db) {        NSString *tableName = NSStringFromClass(self.class);        FMResultSet *resultSet = [db getTableSchema:tableName];        while ([resultSet next]) {            NSString *column = [resultSet stringForColumn:@"name"];            [columns addObject:column];        }    }];    return [columns copy];}
/** * 创建表 * 如果已经创建,返回YES */+ (BOOL)createTable{    __block BOOL res = YES;    DBHelper *jkDB = [DBHelper shareInstance];    [jkDB.dbQueue inTransaction:^(FMDatabase *db, BOOL *rollback) {        NSString *tableName = NSStringFromClass(self.class);                NSString *columeAndType = [self.class getColumeAndTypeString];        //NSLog(@"columeAndType= %@",columeAndType);        NSString *sql = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@(%@);",tableName,columeAndType];        if (![db executeUpdate:sql]) {            res = NO;            *rollback = YES;            return;        };                NSMutableArray *columns = [NSMutableArray array];        FMResultSet *resultSet = [db getTableSchema:tableName];        while ([resultSet next]) {            NSString *column = [resultSet stringForColumn:@"name"];            [columns addObject:column];        }        NSDictionary *dict = [self.class getAllProperties];        NSArray *properties = [dict objectForKey:@"name"];        NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"NOT (SELF IN %@)",columns];        //过滤数组        NSArray *resultArray = [properties filteredArrayUsingPredicate:filterPredicate];        for (NSString *column in resultArray) {            NSUInteger index = [properties indexOfObject:column];            NSString *proType = [[dict objectForKey:@"type"] objectAtIndex:index];            NSString *fieldSql = [NSString stringWithFormat:@"%@ %@",column,proType];            NSString *sql = [NSString stringWithFormat:@"ALTER TABLE %@ ADD COLUMN %@ ",NSStringFromClass(self.class),fieldSql];            if (![db executeUpdate:sql]) {                res = NO;                *rollback = YES;                return ;            }        }    }];        return res;}
/** * 创建表 * 如果已经创建,返回YES *///+ (BOOL)createTable//{//    FMDatabase *db = [FMDatabase databaseWithPath:[JKDBHelper dbPath]];//    if (![db open]) {//        NSLog(@"数据库打开失败!");//        return NO;//    }////    NSString *tableName = NSStringFromClass(self.class);//    NSString *columeAndType = [self.class getColumeAndTypeString];//    NSString *sql = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@(%@);",tableName,columeAndType];//    if (![db executeUpdate:sql]) {//        return NO;//    }////    NSMutableArray *columns = [NSMutableArray array];//    FMResultSet *resultSet = [db getTableSchema:tableName];//    while ([resultSet next]) {//        NSString *column = [resultSet stringForColumn:@"name"];//        [columns addObject:column];//    }//    NSDictionary *dict = [self.class getAllProperties];//    NSArray *properties = [dict objectForKey:@"name"];//    NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"NOT (SELF IN %@)",columns];//    //过滤数组//    NSArray *resultArray = [properties filteredArrayUsingPredicate:filterPredicate];////    for (NSString *column in resultArray) {//        NSUInteger index = [properties indexOfObject:column];//        NSString *proType = [[dict objectForKey:@"type"] objectAtIndex:index];//        NSString *fieldSql = [NSString stringWithFormat:@"%@ %@",column,proType];//        NSString *sql = [NSString stringWithFormat:@"ALTER TABLE %@ ADD COLUMN %@ ",NSStringFromClass(self.class),fieldSql];//        if (![db executeUpdate:sql]) {//            return NO;//        }//    }//    [db close];//    return YES;//}
- (BOOL)saveOrUpdate{    id primaryValue = [self valueForKey:primaryId];    if ([primaryValue intValue] <= 0) {        return [self save];    }        return [self update];}
- (BOOL)save{    NSString *tableName = NSStringFromClass(self.class);    NSMutableString *keyString = [NSMutableString string];    NSMutableString *valueString = [NSMutableString string];    NSMutableArray *insertValues = [NSMutableArray  array];    for (int i = 0; i < self.columeNames.count; i++) {        NSString *proname = [self.columeNames objectAtIndex:i];        if ([proname isEqualToString:primaryId]) {            continue;        }        [keyString appendFormat:@"%@,", proname];        [valueString appendString:@"?,"];        id value = [self valueForKey:proname];        if (!value) {            value = @"";        }        [insertValues addObject:value];    }        [keyString deleteCharactersInRange:NSMakeRange(keyString.length - 1, 1)];    [valueString deleteCharactersInRange:NSMakeRange(valueString.length - 1, 1)];        DBHelper *jkDB = [DBHelper shareInstance];    __block BOOL res = NO;    [jkDB.dbQueue inDatabase:^(FMDatabase *db) {        NSString *sql = [NSString stringWithFormat:@"INSERT INTO %@(%@) VALUES (%@);", tableName, keyString, valueString];        res = [db executeUpdate:sql withArgumentsInArray:insertValues];        self.pk = res?[NSNumber numberWithLongLong:db.lastInsertRowId].intValue:0;        NSLog(res?@"插入成功":@"插入失败");            }];    return res;}
/** 批量保存用户对象 */+ (BOOL)saveObjects:(NSArray *)array{    NSLog(@"BD保存002==>[DBModel class]= %@",[DBModel class]);    //判断是否是JKBaseModel的子类    for (DBModel *model in array) {        if (![model isKindOfClass:[DBModel class]]) {            return NO;        }    }        __block BOOL res = YES;    DBHelper *jkDB = [DBHelper shareInstance];    // 如果要支持事务    [jkDB.dbQueue inTransaction:^(FMDatabase *db, BOOL *rollback) {        for (DBModel *model in array) {            NSString *tableName = NSStringFromClass(model.class);            NSMutableString *keyString = [NSMutableString string];            NSMutableString *valueString = [NSMutableString string];            NSMutableArray *insertValues = [NSMutableArray  array];            for (int i = 0; i < model.columeNames.count; i++) {                NSString *proname = [model.columeNames objectAtIndex:i];                if ([proname isEqualToString:primaryId]) {                    continue;                }                [keyString appendFormat:@"%@,", proname];                [valueString appendString:@"?,"];                id value = [model valueForKey:proname];                if (!value) {                    value = @"";                }                [insertValues addObject:value];            }            [keyString deleteCharactersInRange:NSMakeRange(keyString.length - 1, 1)];            [valueString deleteCharactersInRange:NSMakeRange(valueString.length - 1, 1)];                        NSString *sql = [NSString stringWithFormat:@"INSERT INTO %@(%@) VALUES (%@);", tableName, keyString, valueString];            BOOL flag = [db executeUpdate:sql withArgumentsInArray:insertValues];            model.pk = flag?[NSNumber numberWithLongLong:db.lastInsertRowId].intValue:0;            NSLog(flag?@"插入成功":@"插入失败");                        if (!flag) {                res = NO;                *rollback = YES;                return;            }        }    }];    return res;}
/** 更新单个对象 */- (BOOL)update{    DBHelper *jkDB = [DBHelper shareInstance];    __block BOOL res = NO;    [jkDB.dbQueue inDatabase:^(FMDatabase *db) {        NSString *tableName = NSStringFromClass(self.class);        id primaryValue = [self valueForKey:primaryId];        if (!primaryValue || primaryValue <= 0) {            return ;        }        NSMutableString *keyString = [NSMutableString string];        NSMutableArray *updateValues = [NSMutableArray  array];        for (int i = 0; i < self.columeNames.count; i++) {            NSString *proname = [self.columeNames objectAtIndex:i];            if ([proname isEqualToString:primaryId]) {                continue;            }            [keyString appendFormat:@" %@=?,", proname];            id value = [self valueForKey:proname];            if (!value) {                value = @"";            }            [updateValues addObject:value];        }                //删除最后那个逗号        [keyString deleteCharactersInRange:NSMakeRange(keyString.length - 1, 1)];        NSString *sql = [NSString stringWithFormat:@"UPDATE %@ SET %@ WHERE %@ = ?;", tableName, keyString, primaryId];        [updateValues addObject:primaryValue];        res = [db executeUpdate:sql withArgumentsInArray:updateValues];        NSLog(res?@"更新成功":@"更新失败");    }];    return res;}
/** 批量更新用户对象*/+ (BOOL)updateObjects:(NSArray *)array{    for (DBModel *model in array) {        if (![model isKindOfClass:[DBModel class]]) {            return NO;        }    }    __block BOOL res = YES;    DBHelper *jkDB = [DBHelper shareInstance];    // 如果要支持事务    [jkDB.dbQueue inTransaction:^(FMDatabase *db, BOOL *rollback) {        for (DBModel *model in array) {            NSString *tableName = NSStringFromClass(model.class);            id primaryValue = [model valueForKey:primaryId];            if (!primaryValue || primaryValue <= 0) {                res = NO;                *rollback = YES;                return;            }                        NSMutableString *keyString = [NSMutableString string];            NSMutableArray *updateValues = [NSMutableArray  array];            for (int i = 0; i < model.columeNames.count; i++) {                NSString *proname = [model.columeNames objectAtIndex:i];                if ([proname isEqualToString:primaryId]) {                    continue;                }                [keyString appendFormat:@" %@=?,", proname];                id value = [model valueForKey:proname];                if (!value) {                    value = @"";                }                [updateValues addObject:value];            }                        //删除最后那个逗号            [keyString deleteCharactersInRange:NSMakeRange(keyString.length - 1, 1)];            NSString *sql = [NSString stringWithFormat:@"UPDATE %@ SET %@ WHERE %@=?;", tableName, keyString, primaryId];            [updateValues addObject:primaryValue];            BOOL flag = [db executeUpdate:sql withArgumentsInArray:updateValues];            NSLog(flag?@"更新成功":@"更新失败");            if (!flag) {                res = NO;                *rollback = YES;                return;            }        }    }];        return res;}
/** 删除单个对象 */- (BOOL)deleteObject{    DBHelper *jkDB = [DBHelper shareInstance];    __block BOOL res = NO;    [jkDB.dbQueue inDatabase:^(FMDatabase *db) {        NSString *tableName = NSStringFromClass(self.class);        id primaryValue = [self valueForKey:primaryId];        if (!primaryValue || primaryValue <= 0) {            return ;        }        NSString *sql = [NSString stringWithFormat:@"DELETE FROM %@ WHERE %@ = ?",tableName,primaryId];        res = [db executeUpdate:sql withArgumentsInArray:@[primaryValue]];        NSLog(res?@"删除成功":@"删除失败");    }];    return res;}
/** 批量删除用户对象 */+ (BOOL)deleteObjects:(NSArray *)array{    for (DBModel *model in array) {        if (![model isKindOfClass:[DBModel class]]) {            return NO;        }    }        __block BOOL res = YES;    DBHelper *jkDB = [DBHelper shareInstance];    // 如果要支持事务    [jkDB.dbQueue inTransaction:^(FMDatabase *db, BOOL *rollback) {        for (DBModel *model in array) {            NSString *tableName = NSStringFromClass(model.class);            id primaryValue = [model valueForKey:primaryId];            if (!primaryValue || primaryValue <= 0) {                return ;            }                        NSString *sql = [NSString stringWithFormat:@"DELETE FROM %@ WHERE %@ = ?",tableName,primaryId];            BOOL flag = [db executeUpdate:sql withArgumentsInArray:@[primaryValue]];            NSLog(flag?@"删除成功":@"删除失败");            if (!flag) {                res = NO;                *rollback = YES;                return;            }        }    }];    return res;}
/** 通过条件删除数据 */+ (BOOL)deleteObjectsByCriteria:(NSString *)criteria{    DBHelper *jkDB = [DBHelper shareInstance];    __block BOOL res = NO;    [jkDB.dbQueue inDatabase:^(FMDatabase *db) {        NSString *tableName = NSStringFromClass(self.class);        NSString *sql = [NSString stringWithFormat:@"DELETE FROM %@ %@ ",tableName,criteria];        res = [db executeUpdate:sql];        NSLog(res?@"删除成功":@"删除失败");    }];    return res;}
/** 通过条件删除 (多参数)--2 */+ (BOOL)deleteObjectsWithFormat:(NSString *)format, ...{    va_list ap;    va_start(ap, format);    NSString *criteria = [[NSString alloc] initWithFormat:format locale:[NSLocale currentLocale] arguments:ap];    va_end(ap);        return [self deleteObjectsByCriteria:criteria];}
/** 清空表 */+ (BOOL)clearTable{    DBHelper *jkDB = [DBHelper shareInstance];    __block BOOL res = NO;    [jkDB.dbQueue inDatabase:^(FMDatabase *db) {        NSString *tableName = NSStringFromClass(self.class);                NSString *sql = [NSString stringWithFormat:@"DELETE FROM %@",tableName];        res = [db executeUpdate:sql];        NSLog(res?@"清空成功":@"清空失败");    }];    return res;}
///0708DB/** 查询全部数据 */+ (NSArray *)findAll{    NSLog(@"jkdb---%s",__func__);    DBHelper *jkDB = [DBHelper shareInstance];    NSMutableArray *users = [NSMutableArray array];    [jkDB.dbQueue inDatabase:^(FMDatabase *db) {        NSString *tableName = NSStringFromClass(self.class);        NSString *sql = [NSString stringWithFormat:@"SELECT * FROM %@",tableName];        FMResultSet *resultSet = [db executeQuery:sql];        while ([resultSet next]) {            DBModel *model = [[self.class alloc] init];            for (int i=0; i< model.columeNames.count; i++) {                NSString *columeName = [model.columeNames objectAtIndex:i];                NSString *columeType = [model.columeTypes objectAtIndex:i];                if ([columeType isEqualToString:SQLTEXT]) {                    [model setValue:[resultSet stringForColumn:columeName] forKey:columeName];                } else {                    [model setValue:[NSNumber numberWithLongLong:[resultSet longLongIntForColumn:columeName]] forKey:columeName];                }            }            [users addObject:model];            FMDBRelease(model);        }    }];        return users;}
+ (instancetype)findFirstWithFormat:(NSString *)format, ...{    va_list ap;    va_start(ap, format);    NSString *criteria = [[NSString alloc] initWithFormat:format locale:[NSLocale currentLocale] arguments:ap];    va_end(ap);        return [self findFirstByCriteria:criteria];}
/** 查找某条数据 */+ (instancetype)findFirstByCriteria:(NSString *)criteria{    NSArray *results = [self.class findByCriteria:criteria];    if (results.count < 1) {        return nil;    }        return [results firstObject];}
+ (instancetype)findByPK:(int)inPk{    NSString *condition = [NSString stringWithFormat:@"WHERE %@=%d",primaryId,inPk];    return [self findFirstByCriteria:condition];}
+ (NSArray *)findWithFormat:(NSString *)format, ...{    va_list ap;    va_start(ap, format);    NSString *criteria = [[NSString alloc] initWithFormat:format locale:[NSLocale currentLocale] arguments:ap];    va_end(ap);        return [self findByCriteria:criteria];}
/** 通过条件查找数据 */+ (NSArray *)findByCriteria:(NSString *)criteria{    DBHelper *jkDB = [DBHelper shareInstance];    NSMutableArray *users = [NSMutableArray array];    [jkDB.dbQueue inDatabase:^(FMDatabase *db) {        NSString *tableName = NSStringFromClass(self.class);        NSString *sql = [NSString stringWithFormat:@"SELECT * FROM %@ %@",tableName,criteria];        FMResultSet *resultSet = [db executeQuery:sql];        while ([resultSet next]) {            DBModel *model = [[self.class alloc] init];            for (int i=0; i< model.columeNames.count; i++) {                NSString *columeName = [model.columeNames objectAtIndex:i];                NSString *columeType = [model.columeTypes objectAtIndex:i];                if ([columeType isEqualToString:SQLTEXT]) {                    [model setValue:[resultSet stringForColumn:columeName] forKey:columeName];                } else {                    [model setValue:[NSNumber numberWithLongLong:[resultSet longLongIntForColumn:columeName]] forKey:columeName];                }            }            [users addObject:model];            FMDBRelease(model);        }    }];        return users;}
#pragma mark - util method+ (NSString *)getColumeAndTypeString{    NSMutableString* pars = [NSMutableString string];    NSDictionary *dict = [self.class getAllProperties];        NSMutableArray *proNames = [dict objectForKey:@"name"];    NSMutableArray *proTypes = [dict objectForKey:@"type"];        for (int i=0; i< proNames.count; i++) {        [pars appendFormat:@"%@ %@",[proNames objectAtIndex:i],[proTypes objectAtIndex:i]];        if(i+1 != proNames.count)        {            [pars appendString:@","];        }    }    return pars;}
- (NSString *)description{    NSString *result = @"";    NSDictionary *dict = [self.class getAllProperties];    NSMutableArray *proNames = [dict objectForKey:@"name"];    for (int i = 0; i < proNames.count; i++) {        NSString *proName = [proNames objectAtIndex:i];        id  proValue = [self valueForKey:proName];        result = [result stringByAppendingFormat:@"%@:%@\n",proName,proValue];    }    return result;}
#pragma mark - must be override method/** 如果子类中有一些property不需要创建数据库字段,那么这个方法必须在子类中重写 */+ (NSArray *)transients{    return [NSArray array];}
 
@end


本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之IOS频道!


本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程