美文网首页iOS开发技巧iOS进阶指南
Realm 与MJExtension 配合使用在项目中出现的问题

Realm 与MJExtension 配合使用在项目中出现的问题

作者: 巨人永不倒 | 来源:发表于2016-02-01 16:57 被阅读1777次
  • Realm是一个基于自己的持久化引擎,简单并且快速的面向对象移动数据库。支持iOS、OS X(Objective-C和Swift)以及Android。Realm文件可以跨平台共享,让Java、Swift和Objective-C使用相同的抽象模型访问,从而让您在各个平台上使用尽可能相似的业务逻辑。具体可以参照官方的说明。
  • MJExtension 是转换速度快、使用简单方便的字典转模型框架,减少工程中后台数据转换成前端模型的成本。

在项目中使用Realm和MJExtension,能快速的进行数据对象的转换和存储,开发人员能把精力更多的放在软件业务当中,但是在使用过程中也是有许多坑的,仅此在这记录开发遇到的问题,后面会慢慢收录和完善。

RLMArray 中只能存放简单的 RLMObject 子类类型,与后台数据结构的冲突
比如

photoUrls = (
"/img/56288f05c9684368796bbf82.jpg"
 );

photoUrls里是图片的url,里面包含一个或者多个url,单独使用MJExtension,只需要把photoUrls声明成NSMutableArray类型。使用以下方法,声明数组中存储的类型就能自动映射。

+(NSDictionary *)objectClassInArray
{
    return @{@"photoUrls":NSClassFromString(@"NSString")};
}

使用Realm后,所有的数据对象都要是RLMObject的子类,继承RLMObject获得一些属性,方便Realm存储数据对象。按照以前的做法,声明一个可变数组,声明数组中的Class。然后等着第三方转换成对象,然后就可以愉快的调试代码了,但是Realm中对象的关系都是通过 RLMObject 以及 RLMArray属性来和另一个 RLMObject建立联系,所以并不能使用NSMutableArray来建立对象之间的联系。

如果photoUrls里存储的是json对象没问题,比如

@property(nonatomic,strong)RLMArray<realmSignModel>  * signs;

RlMArray可以当成Realm中的数组,后面声明的是数组存储的对象,以上用MJExtension是没问题的,能顺利的转换。但是RlMArray中只能存储RLMObject,服务器传来的json数组中是string,这就有冲突了。并且在RLMObject中使用NSMutableArray用MJExtension转换数据对象是会崩溃的。

解决方案
Realm中提供了多个方法,对RLMObject进行操作,比如设置一些属性的默认值,添加主键,或者忽略属性。我们要用的就是这个忽略属性方法,该方法防止 Realm 存储数据模型的某个属性。并且Realm 将不会干涉这些属性的常规操作,如下代码,忽略photoUrls属性。

+ (NSArray *)ignoredProperties {
    return @[@"photoUrls"];
}

忽略后创建一个RLMObject对象,声明一个NSMutableArray类型的名称为photoUrls的属性,但是该属性不参与Realm的操作,按照正常的MJExtension方法把服务器的数据放到photoUrls属性中,再声明一个avatarUrls属性,里面存放的是RLMObject,如下

@property(nonatomic,strong)RLMArray<avatarUrlModel>*avatarUrls;

在photoUrls的set方法中,把数组中的数据再赋值给avatarUrls,如下

-(void)setPhotoUrls:(NSMutableArray *)photoUrls
{
    _photoUrls=photoUrls;
//    初始化avatarUrls
    _avatarUrls=[[RLMArray alloc] initWithObjectClassName:@"avatarUrlModel"];
//    循环创建RLMObject加入avatarUrls中
    for (int i=0;i<photoUrls.count; i++) {
        avatarUrlModel * model=[avatarUrlModel new];
        model.avatarUrl=photoUrls[i];
        [_avatarUrls addObject:model];
    }
}

以上操作程序正常运行,能进行完整的数据转对象,并且Realm中存储了完整的数据。

相关文章

网友评论

  • 肖皖:非常感谢
  • 会疼的白痴:你这个有问题啊!
    郡王丶千夜:@ddb49e7d9f8b 他说的问题应该是 取数据库数据的时候取_photoUrls 的时候还得从_avatarUrls里面取值吧
    勤奋的张神:你好,请问会有什么问题啊
  • 784ece964b84:能把完整的demo放到github上面么?
  • 不愿透漏姓名的s:我也不知道 :grin:
  • Dannn_Y:服务器返回的字段和我想要的字段不一样,需要修改这个字段,你是怎么处理的?
    煜寒了:@oneTreee 将服务器的字段加上去并忽略掉,在重写这个字段的setter方法,里面给你想要的那个字段赋值,最后就可以存到realm中了

本文标题:Realm 与MJExtension 配合使用在项目中出现的问题

本文链接:https://www.haomeiwen.com/subject/mzvjkttx.html