【问题标题】:createOrUpdateInRealm:withObject: unexpectedly resets to many relationship when updated with the same objectcreateOrUpdateInRealm:withObject: 使用同一个对象更新时意外重置为多个关系
【发布时间】:2015-01-26 09:28:41
【问题描述】:

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

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";
}];

【问题讨论】:

    标签: objective-c realm


    【解决方案1】:

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

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

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

    【讨论】:

    • 除了我描述的问题之外,它不会抛出任何异常并且工作正常。我同意您的观点,即设置名称就足够了前提是您的对象已经在领域中。我希望澄清的主要问题是,为什么当您使用同一个对象创建或更新时,它会失去其关系。这似乎不是理想的行为。
    • @nacross 我们今天早上刚刚发布了一个update,应该可以解决问题。请更新到 0.90.3,如果一切正常,请告诉我!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多