本节主要讲 数组和字典的 存取,通过data和string的转换来达到目的。
SqliteTool:执行多条sql语句的方法有些问题
Snip20170803_167.pngSqliteModelTool:
+ (BOOL)updateTable:(Class)cls uid:(NSString *)uid
有几处问题要修正:
+ (BOOL)saveOrUpdateModel:(id)model uid:(NSString *)uid
1、要考虑到表更新失败:
if ([self isTableRequiredUpdate:cls uid:uid]) {
BOOL updateSuccess = [self updateTable:cls uid:uid];
if (!updateSuccess) {
NSLog(@"更新数据库表结构失败");
return NO;
}
}
2、保存的时候,字典或数组转换成NSData,再转成字符串
if ([value isKindOfClass:[NSArray class]] || [value isKindOfClass:[NSDictionary class]]) {
// 在这里, 把字典或者数组, 处理成为一个字符串, 保存到数据库里面去
// 字典/数组 -> data
NSData *data = [NSJSONSerialization dataWithJSONObject:value options:NSJSONWritingPrettyPrinted error:nil];
// data -> nsstring
value = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}
3、解析的时候,如果类型是数组或字典,则转成NSData,再转成字典或数组
3.1 从模型中获取 字段和类型的 映射表:
NSDictionary *nameTypeDic = [XMGModelTool classIvarNameTypeDic:cls];
3.2 字符串-->data-->数组、字典
[modelDic enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
NSString *type = nameTypeDic[key];
id resultValue = obj;
if ([type isEqualToString:@"NSArray"] || [type isEqualToString:@"NSDictionary"]) {
// 字符串 ->
NSData *data = [obj dataUsingEncoding:NSUTF8StringEncoding];
resultValue = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
}else if ([type isEqualToString:@"NSMutableArray"] || [type isEqualToString:@"NSMutableDictionary"]) {
NSData *data = [obj dataUsingEncoding:NSUTF8StringEncoding];
resultValue = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
}
[model setValue:resultValue forKeyPath:key];
}];
网友评论