我们使用coreData时候,会遇到较为复杂的数据类型的存贮,例如,我们要存一个模型,但是一个模型里面有个字典,这时候,我们该如何存贮呢
如图所示,一个对象中含有一个字典
我们实现一个公共的方法,将对象的所有属性都赋值给对应的coreData模型
id makeRemoteModelToCoreDataModel(id remoteModel,Class remoteDataClass,NSManagedObject *coreDataModel) {
int i;
unsigned int propertyCount = 0;
objc_property_t *propertyList = class_copyPropertyList(remoteDataClass, &propertyCount);
NSMutableArray *propertyNameList = [NSMutableArray array];
for ( i=0; i 0) {
[propertyNameList enumerateObjectsUsingBlock:^(NSString* key, NSUInteger idx, BOOL *stop) {
id obj = [remoteModel valueForKey:key];
if (obj) {
if ([obj isKindOfClass:[NSString class]]) {
[coreDataModel setValue:obj forKey:key];
}else {
NSData *objData = [NSKeyedArchiver archivedDataWithRootObject:obj];
[coreDataModel setValue:objData forKey:key];
}
}
}];
free(propertyList);
return coreDataModel;
}else return nil;
}
存贮数据的时候调用
specialInfoDB = makeRemoteModelToCoreDataModel(specialBO, [specialObjectBO class],specialInfoDB);
在coreData的模型中添加对应的字段,只是数据类型是NSData
如图
读取数据的时候,将coredata的所有字段赋值给我们使用的模型对象
实现的方法
id makeCoreDat服务器托管网aModelToRemoteModel(id CoreDataModel,Class remoteDataClass) {
int i;
unsigned int propertyCount = 0;
objc_property_t *propertyList = class_copyPropertyList(remoteDataClass, &propertyCount);
NSMutableArray *propertyNameList = [NSMutableArray array];
for ( i=0; i 0) {
id dataModal = [[remoteDataClass alloc]init];
[propertyNameList enumerateObjectsUsingBlock:^(NSString* key, NSUInteger idx, BOOL *stop) {
id obj = [CoreDataModel valueForKey:key];
if ([obj isKindOfClass:[NSString class]]) {
[dataModal setValue:obj forKey:key];
}else {
id objFromData = [NSKeyedUnarchiver unarchiveObjectWithData:obj];
[dataModal setValue:objFromData forKey:key];
}
}];
free(propertyList);
return dataModal;
}else return nil;
}
调用
specialObjectBO* specialBO = makeCoreDataModelToRemoteModel(specia服务器托管网lInfoDB, [specialObjectBO class]);
这两处重点用到了字典和NSData的相互转化
NSData *dictData = [NSKeyedArchiver archivedDataWithRootObject:dict];
NSDictionary *subDict = [NSKeyedUnarchiver unarchiveObjectWithData:dictData];
注意点,我们CoreData中的字段是不能直接存贮我们自定义对象类型的,所以,如果我们要存贮的字段如果是一个自定义对象类型,则要将该字段成字段类型,然后转换成Data存贮
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
相关推荐: 真·Redis缓存优化—97%的优化率你见过嘛? | 京东云技术团队
本文通过一封618前的R2M(公司内部缓存组件,可以认为等同于Redis)告警,由浅入深的分析了该告警的直接原因与根本原因,并根据原因提出相应的解决方法,希望能够给大家在排查类似问题时提供相应的思路。 一、问题排查 1.1 邮件告警 正值618值班前夕,某天收…