// 得到已经传入的数据
//新创建的模型对象
SSSGyoModel *gyoModelToSelect = [SSSGyoModel new];
//查找时需要的参数
gyoModelToSelect.kokocd = testKokocd; //该赋值的testKokocd
gyoModelToSelect.koshicd = testKoshicd;
gyoModelToSelect.sagymd = testYmd;
gyoModelToSelect.gdseqno = testGdseqno;
gyoModelToSelect.kaishacd = testKaishacd;
NSArray *gyosyaList = [gyoModelToSelect fetchWithparams:[gyoModelToSelect getRecordParams] error:&dbError];
- (NSDictionary *)getRecordParams {
return @{
@"kojicd":_kokocd,
@"kokucd":_koshicd,
@"sagyoymd":_sagymd,
@"gdseqno":_gdseqno,
@"kaishacd":_kaishacd,
};
}
其中:
//调用了下面的方法
- (NSArray<SWKDataModel *> *)fetchWithparams:(NSDictionary *)params error:(NSError *__autoreleasing *)error
{
return [self fetchWithparams:params orderParams:nil error:error];
}
- (NSArray<SWKDataModel *> *)fetchWithparams:(NSDictionary *)params orderParams:(NSArray<NSDictionary *> *)orderParams error:(NSError *__autoreleasing *)error {
// 先获取表名
NSString *tblName = [self getTableName];
// 条件
NSMutableString *sql = [NSMutableString stringWithFormat:@"SELECT * FROM %@", tblName];
NSMutableString *where = [NSMutableString stringWithString:@""];
NSMutableString *order = [NSMutableString stringWithString:@""];
NSMutableArray *values = [NSMutableArray array];
//params是传入的参数
[params enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
if ([where length] > 0) {
[where appendFormat:@" AND %@ = ?", key];
}
else {
[where appendFormat:@" WHERE %@ = ?", key];
}
[values addObject:obj];
}];
if ([where length] > 0){
[sql appendString:where];
}
for (NSArray *orderArray in orderParams) {
if ([order length] > 0) {
[order appendFormat:@", %@ %@", orderArray[0], orderArray[1]];
}
else {
[order appendFormat:@" order by %@ %@", orderArray[0], orderArray[1]];
}
}
if ([order length] > 0){
[sql appendString:order];
}
[sql appendString:@";"];
// SQL
FMDatabase *db = [SWKDataAccessManager openDatabase];
NSArray *models = [SWKDataAccessManager executeQuery:sql values:values loadTarget:[self class] db:db error:error];
[db close];
return models;
}
其中:
+ (FMDatabase *)openDatabase{
//open database with FMDB.
FMDatabase *db = [self getDB];
if ([db open])
{
return db;
}
return nil;
}
+ (FMDatabase *)getDB {
static FMDatabase *sDb = nil;
if (!sDb)
{
NSString *dbPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
dbPath = [dbPath stringByAppendingPathComponent:@"ss_mock.db"];
NSLog(@"DB File Location: %@", dbPath);
//判断在Document下面有没有DB文件
NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:dbPath]) {
//不存在
//复制默认的DB文件(保存在本地,只是第一次)
NSBundle *bundle = [NSBundle mainBundle];
NSString *orgPath = [bundle bundlePath];
//开始的文件的path
orgPath = [orgPath stringByAppendingPathComponent:@"ss_mock.db"];
// 默认的DB文件复制到Document的下面
if (![fileManager copyItemAtPath:orgPath toPath:dbPath error:nil]) {
//error
NSLog(@"db file copy error. : %@ to %@.", orgPath, dbPath);
return nil;
}
}
//open database with FMDB. FMDB框架里面的方法。
sDb = [FMDatabase databaseWithPath:dbPath];
}
return sDb;
}
+ (NSArray *)executeQuery:(NSString *)sql values:(NSArray *)values loadTarget:(Class)loadTarget db:(FMDatabase *)db error:(NSError *__autoreleasing *)error
{
NSMutableArray *array = [NSMutableArray array];
FMResultSet * ret = [db executeQuery:sql values:values error:error];
if (ret)
{
while ([ret next]) {
SWKDataModel *target = [[loadTarget alloc] init];
[target configureValuesWithResultSet:ret];
[array addObject:target];
}
}
return array;
}
其中:
- (void)configureValuesWithResultSet:(FMResultSet *)resultSet
{
// 是根据_columnNameToIndexMap属性获取到列名称(columnName)的对应列号(columnIdx)。_columnNameToIndexMap是一个 // NSMutableDictionary对象。其中key表示的是指定结果集中对应列的名称,value表示的是指定结果集中对应的列号(columnIdx)。
NSMutableDictionary *columnMap = [resultSet columnNameToIndexMap];
// 和列名同名的属性,设置值
[columnMap enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
// 列的名称不是空的
// [self respondsToSelector:NSSelectorFromString(key)] : 在属性赋值时,做容错处理,防止因为后台数据导致的异常
if ((![resultSet columnIsNull:key])
&& ([self respondsToSelector:NSSelectorFromString(key)]))
{
//此处的val不是obj,是列的名称的值
id val = [resultSet objectForColumnName:key];
[self setValue:val forKey:key];
}
}];
}