第一次在简书上写东西,以下内容是我在使用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];