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 < 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 ( i=0; 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]);
これら 2 つの場所は、辞書と NSData の相互変換に重点を置いています
NSData *dictData = [NSKeyedArchiver archivedDataWithRootObject:dict];
NSDictionary *subDict = [NSKeyedUnarchiver unarchiveObjectWithData:dictData];
CoreData のフィールドにはカスタム オブジェクト タイプを直接保存できないことに注意してください。そのため、保存したいフィールドがカスタム オブジェクト タイプの場合は、フィールドをフィールド タイプに変換してからデータ ストレージに変換する必要があります。