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]);

这两处重点用到了字典和NSData的相互转化

复制代码
NSData *dictData = [NSKeyedArchiver archivedDataWithRootObject:dict];

NSDictionary *subDict = [NSKeyedUnarchiver unarchiveObjectWithData:dictData];

注意点,我们CoreData中的字段是不能直接存贮我们自定义对象类型的,所以,如果我们要存贮的字段如果是一个自定义对象类型,则要将该字段成字段类型,然后转换成Data存贮

相关推荐
Anhty1 小时前
2026三款AI变声器测评:iOS男变女自然声线实测
人工智能·功能测试·ios·智能手机
传奇开心果编程1 小时前
组合优先开发范式:从汉字造字原理到声明式UI组件组合思想
android·flutter·ios·swiftui·移动开发·harmonyos·android jetpack
腾讯端服务2 小时前
一码Duo端-Kuikly-iOS折叠屏新UI适配实践
android·ui·ios·kotlin·鸿蒙
2501_915918412 小时前
Windows 上开发 React Native iOS,真机调试、Fast Refresh 与打包 ipa
windows·vscode·react native·ios·个人开发·swift·敏捷流程
aiopencode16 小时前
局域网设备抓包怎么做?用 TraceEagle 抓电视、游戏机和 IoT 流量
后端·ios
奇牙coding17 小时前
GPT-5.5 报 401 invalid_api_key 怎么办?换密钥前按 4 层排查请求头、项目权限和端点
数据库·gpt·ios·ai
szp200518 小时前
中文字幕烧进视频后整片空白:CoreText 低报行高,导出照样成功
ios·swift
二流小码农18 小时前
HarmonyOS开发助手,0代码让元服务从开发到上架
android·ios·harmonyos
zhongben123_1 天前
从0到1开发一款生鲜配送APP:核心技术难点与架构避坑指南
大数据·运维·人工智能·ios·架构·web app
zhongben_keji1 天前
批发商城APP怎么做:价格引擎、授信台账与资金合规的设计要点
ios·小程序·web app