Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c createOrUpdateInRealm:withObject:在使用同一对象更新时意外重置为多个关系_Objective C_Realm - Fatal编程技术网

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

Objective c createOrUpdateInRealm:withObject:在使用同一对象更新时意外重置为多个关系,objective-c,realm,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:re

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

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);
}];
控制台输出

我使用了create或update,因为此时我不知道我是否有一个新对象或以前保存的对象

我有其他功能,但我很好奇为什么这不起作用?我最好的猜测是,这与将数据映射到返回某些“意外”值的对象时使用的键值编码有关

有没有合适的方法来避免这个问题,或者我应该坚持我的替代方法?

功能替代品


在领域中,为对象的属性调用setter就足以更新该对象(只要您在写事务中)

使用持久化的
RLMObject
子类调用
createOrUpdateInRealm
,将在数据库中创建该对象的副本,并且实际上将创建副本


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

除了我描述的问题之外,它不会引发任何异常,工作正常。我同意你的观点,只要你的对象已经在一个领域中,设置名称就足够了。我希望澄清的主要问题是,为什么在使用同一对象创建或更新时,它会丢失其关系。“这似乎是不可取的行为。”nacross我们今天早上刚刚发布了一个解决问题的软件。请更新到0.90.3,并让我知道是否一切都适合你!
dogs before: 1
dogs after: 0
RLMRealm *realm = [RLMRealm defaultRealm];
[realm transactionWithBlock:^{
    if (![self.person realm]) {
        [realm addObject:self.person];
    }

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