做么网站有黄,手机可以搭建网站吗,重庆市造价工程信息网官网,信息化项目建设背景我们使用coreData时候#xff0c;会遇到较为复杂的数据类型的存贮#xff0c;例如#xff0c;我们要存一个模型#xff0c;但是一个模型里面有个字典#xff0c;这时候#xff0c;我们该如何存贮呢 如图所示#xff0c;一个对象中含有一个字典
我们实现一个公共的方法…我们使用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 ( i0; i propertyCount; i ) {objc_property_t *thisProperty propertyList i;const char* propertyName property_getName(*thisProperty);NSString *string [NSString stringWithFormat:%s,propertyName];[propertyNameList addObject:string];}if (propertyNameList.count 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 makeCoreDataModelToRemoteModel(id CoreDataModel,Class remoteDataClass) {int i;unsigned int propertyCount 0;objc_property_t *propertyList class_copyPropertyList(remoteDataClass, propertyCount);NSMutableArray *propertyNameList [NSMutableArray array];for ( i0; i propertyCount; i ) {objc_property_t *thisProperty propertyList i;const char* propertyName property_getName(*thisProperty);NSString *string [NSString stringWithFormat:%s,propertyName];[propertyNameList addObject:string];}if (propertyNameList.count 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(specialInfoDB, [specialObjectBO class]);
这两处重点用到了字典和NSData的相互转化
NSData *dictData [NSKeyedArchiver archivedDataWithRootObject:dict];NSDictionary *subDict [NSKeyedUnarchiver unarchiveObjectWithData:dictData];注意点我们CoreData中的字段是不能直接存贮我们自定义对象类型的所以如果我们要存贮的字段如果是一个自定义对象类型则要将该字段成字段类型然后转换成Data存贮