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

Realm 与MJExtension 配合使用在项目中出现的问题_第1张图片
  • 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  * 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*avatarUrls;

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

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

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

你可能感兴趣的:(Realm 与MJExtension 配合使用在项目中出现的问题)