createOrUpdateInRealm:withObject:使用同一对象更新时意外重置为多个关系

时间:2015-01-26 09:28:41

标签: objective-c realm

当您使用自身更新领域对象时,似乎会重置许多关系。以下代码将导致人们成为孤儿。

RLMRealm *realm = [RLMRealm defaultRealm];
[realm transactionWithBlock:^{
    self.person.name = @"Fred";
    NSLog(@"dogs before: %d", self.person.dogs.count);
    self.person = [Person createOrUpdateInRealm:realm withObject:self.person];
    NSLog(@"dogs after: %d", self.person.dogs.count);
}];

控制台输出

dogs before: 1
dogs after: 0

我使用了create或update,因为此时我不知道我是否有新对象或以前持久化的对象。

我有功能替代,但我很好奇为什么这不起作用?我最好的猜测是它与用于将数据映射到返回一些对象的键值编码有关“意外”的价值。

有没有合适的方法可以避免这个问题,还是应该坚持我的替代方法?

运作替代

RLMRealm *realm = [RLMRealm defaultRealm];
[realm transactionWithBlock:^{
    if (![self.person realm]) {
        [realm addObject:self.person];
    }

    self.person.name = @"Fred";
}];

1 个答案:

答案 0 :(得分:0)

在Realm中,为对象的属性调用setter就足以更新该对象(只要你在写入事务中)。

使用持久性createOrUpdateInRealm子类调用RLMObject将在数据库中创建该对象的重复,实际上将throw an exception in the future

简而言之,在这种情况下,您不应该调用createOrUpdateInRealm,而只是在写入事务中设置人员的name属性。