美文网首页数据库和缓存
使用Realm数据库遇到的坑

使用Realm数据库遇到的坑

作者: 啊王王李孟姚 | 来源:发表于2018-03-07 20:21 被阅读56次

第一次在简书上写东西,以下内容是我在使用realm遇到的一些问题以及解决方案,希望可以帮助大家.

第一个问题: [realm initWithValue:dict]中dict中的某个key值是nil造成的崩溃问题

原因是:realm中数据的赋值原理是使用KVC,所以value值如果是nil,就会造成问题,所以前提一定要做容错处理 

第二个问题:在表关联中,子表有主键,父表创建的方法需注意

不会由于子表中相同客户id,造成客户已存在的问题,所有不能
[realm addObject:]

父表创建的方法用更新方法  
(addOrUpdateObject)
因为同一子表可以和不同的父表进行关联,如果父表不使用更新的方法的,就会崩溃  

第三个问题:validated object for property (属性验证对象)

如果realm中表中有long double 等有关assgin的属性,使用kvc赋值的时候编译的阶段不会出错,但是在运行的时候会出错
报错为validated object for property,即不匹配,不容易找出错 

例子:你的modle中有assgin的值,但是你忘记是assgin属性,其中"lastUpdateTime"是assgin属性
写成如下的格式
CDRLMCoumModel *model =
[[CDRLMCoumModel alloc]initWithValue:
@{@"isConnected":isConnect,
@"namesId":namesId,
@"lastUpdateTime":[GlobalModel shared].alertStartTime}]

其中
[GlobalModel shared].alertStartTime

是数值,这时你编译是没错的,但是运行中会报上述问题;
解决方案:
1.将[GlobalModel shared].alertStartTime包装成对象即可
2.model.lastUpdateTime = [[GlobalModel shared].alertStartTime longLongValue];

第四个问题:线程错误:Realm accessed from incorrect thread Realm

造成这种问题有俩种情况:
1.你在工程中多次用到realm的相同的增删改的操作,封装成一个单例类.
2.在网络数据请求API进行realm的操作,但是网络数据请求API和数据展示不在同一个类中,既造成上述问题.

第五个问题:.Verify_thread:验证线程的问题
造成问题的原因是:

1.在不同的线程里进行了同一model值的使用
举例:
//coumModel在主线程内
CDRLMCoumModel *coumModel = [[CDRLMCoumModel objectsWhere:@"entId == %@ AND opId == %@ AND source == %@ AND imId == %@",entId,opId,source,imId] firstObject];

//在API请求中用到coumModel中的值coumModel.sessionId
//但是coumModel和coumModel.sessionId未在一个线程内
CDHttpRequestTool imEndTalkWithImId:imId endTimeStr:[GlobalModel shared].alertEndTime sessionId:coumModel.currentSessionID source:source success:^(NSDictionary *customerDic) {
[realm beginWriteTransaction];

  CDRLMCustomerModel * customerModel =   [CDRLMCustomerModel createOrUpdateInDefaultRealmWithValue:customerDic];

  [CDRLMCoumModel createOrUpdateInRealm:realm withValue:@{@"sessionId":coumModel.sessionId,@"commId":customerDic[@"commId"],@"imId":imId,@"customDetail":customerModel,@"hasEnd":@"1"}];

       [realm commitWriteTransaction];

}

第六个问题:RLM Verify In Write Transaction RLM验证写事务验证

犯错的原因是:在创建数据model的时候,将字典写在了事务里了
举例:
错误的❌:
RLMRealm *realm = [RLMRealm defaultRealm];
                  [realm beginWriteTransaction];
//userDict写在事务里了
NSDictionary *userDict = @{@"userId":weakself.customerId,@"userName":weakself.userName,@"entid":dict[@"loginEntId"],@"telPhone":weakself.telPhone,@"fixedPhone":weakself.fixedPhone,@"loginName":weakself.loginName};
   [CDRLMCustomerModel createOrUpdateInRealm:realm withValue:userDict];
                  [realm commitWriteTransaction];

正确的✅
NSDictionary *userDict = @{@"userId":weakself.customerId,@"userName":weakself.userName,@"entid":dict[@"loginEntId"],@"telPhone":weakself.telPhone,@"fixedPhone":weakself.fixedPhone,@"loginName":weakself.loginName};
                  RLMRealm *realm = [RLMRealm defaultRealm];
                  [realm beginWriteTransaction];
                  [CDRLMCustomerModel createOrUpdateInRealm:realm withValue:userDict];
                  [realm commitWriteTransaction];

相关文章

网友评论

本文标题:使用Realm数据库遇到的坑

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