将RLMObject添加到另一个对象RLMArray仅适用于第一次

时间:2016-06-22 20:22:57

标签: objective-c realm

对于我的应用程序的聊天部分,我试图将对话数据保存到设备中,这样用户每次打开应用程序时都不需要刷新。

从数据库中获取所有消息后,我遍历数组并将它们存储在对话模型消息属性(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];

1 个答案:

答案 0 :(得分:2)

查看代码,您要查询具有相同TERMessage的{​​{1}}对象是否已属于serverID。话虽如此,虽然另一个self.model对象可能尚未链接到TERMessage,但很可能该对象仍然存在于领域中(即它在self.model中领域文件中的表。)

如果是这种情况,那么当您创建第二个TERMessage对象并尝试将其添加到TERMessage时,Realm会尝试将其添加到self.model表并发现另一个具有相同主键的对象已经存在。

要解决此问题,您需要使查询逻辑更加彻底,以确保在发生这种情况时正确捕获原始对象。

首先,您可以使用TERMessage查看具有主键的对象是否已存在。如果是,则可以使用Realm的反向关系功能来查看它是否已属于[RLMObject objectForPrimaryKey:]

self.model