iOS は coreData を使用してページのモデル データに辞書を保存します

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 のフィールドにはカスタム オブジェクト タイプを直接保存できないことに注意してください。そのため、保存したいフィールドがカスタム オブジェクト タイプの場合は、フィールドをフィールド タイプに変換してからデータ ストレージに変換する必要があります。

おすすめ

転載: blog.csdn.net/LIUXIAOXIAOBO/article/details/132612261