对于我的应用程序的聊天部分,我试图将对话数据保存到设备中,这样用户每次打开应用程序时都不需要刷新。
从数据库中获取所有消息后,我遍历数组并将它们存储在对话模型消息属性(RLMArray)中。
由于每条消息都有一个主键,因此在将其添加到对话消息之前,我还会检查该域以查看该消息是否已存在。这在第一次使用应用程序时工作正常,但是如果我再次运行它会出现此错误:
'RLMException', reason: 'Can't set primary key property 'serverID' to existing value '1355'.'
这是我将消息添加到领域的代码
RLMRealm *realm = [RLMRealm defaultRealm];
[realm beginWriteTransaction];
for (Message *model in messageArray) {
NSLog(@"message model: %@", model);
TERMessage *message = [[TERMessage alloc] initWithMessage:model];
TERMessage *existingObject = [self.model.messages objectsWhere:@"serverID == %@",message.serverID].firstObject;
NSLog(@"existing object: %@", existingObject);
if (existingObject == nil) {
[self.model.messages addObject:message];
} else {
NSLog(@"not being aded");
}
}
[realm commitWriteTransaction];
答案 0 :(得分:2)
查看代码,您要查询具有相同TERMessage
的{{1}}对象是否已属于serverID
。话虽如此,虽然另一个self.model
对象可能尚未链接到TERMessage
,但很可能该对象仍然存在于领域中(即它在self.model
中领域文件中的表。)
如果是这种情况,那么当您创建第二个TERMessage
对象并尝试将其添加到TERMessage
时,Realm会尝试将其添加到self.model
表并发现另一个具有相同主键的对象已经存在。
要解决此问题,您需要使查询逻辑更加彻底,以确保在发生这种情况时正确捕获原始对象。
首先,您可以使用TERMessage
查看具有主键的对象是否已存在。如果是,则可以使用Realm的反向关系功能来查看它是否已属于[RLMObject objectForPrimaryKey:]
:
self.model