【问题标题】:Core Data managed object does not see related objects until restart SimulatorCore Data 托管对象在重启模拟器之前看不到相关对象
【发布时间】:2012-03-15 06:45:19
【问题描述】:

有一个Stumper(至少对我来说)。

我正在使用带有 ARC 的 iOS 5.0,以及 UIManagedDocument 中的 Core Data。

我有一个实体(组)与实体(人)之间存在一对多关系(称为人)。当我添加一个新组,然后添加一个新人员(将人员的 .group 关系设置为新组)时,我无法使用 Person 实体上的谓词检索相关人员 where ("group == %@", myGroup )。我还尝试使用 Group 的 addPerson 设置器。

如果我关闭 XCode 模拟器并重新运行它,它会识别上一次运行中创建的关系,我什至可以将新人添加到现有的 Group 对象中。我只是无法添加新组,然后在不关闭模拟器(或设备,如果我在设备上运行)的情况下添加人员以查看关系。

如果我执行 [group.people count],则在添加新组和相关人员后,它会立即为我提供正确的数字。但是在我重新启动应用程序之前,带有谓词的提取不起作用。

似乎 UIManagedDocument 的 managedObjectContext 没有看到关系。我试过保存上下文、保存 context.parentContext 和保存文档。这些都没有帮助。

任何想法都将不胜感激!

【问题讨论】:

  • 你的模型中是否设置了反向关系?
  • 是的。我有一个从 Group 到 Person 的一对多,命名为 people。以及从 Person 到 Group 的逆一对一,命名为 group。

标签: core-data ios5 uimanageddocument


【解决方案1】:

我遇到了类似的问题,执行更新对我没有帮助。这样做了:

NSArray *insertedObjs = [[self.managedObjectContext insertedObjects] allObjects];
if ([insertedObjs count] > 0) {
    NSError * error;
    [self.managedObjectContext obtainPermanentIDsForObjects:insertedObjs error:&error];
}

我在插入对象之后和保存之前运行它。

【讨论】:

    【解决方案2】:

    一个 UIManagedDocument 会保存,嗯,基本上,当它感觉像它时;您无法控制何时发生。但是,它肯定会节省应用程序终止的时间,这就是您在重新启动时看到插入的原因。

    因此,虽然您可能认为您拥有永久对象 ID,但它们实际上很可能是临时的,因此无法获取。只需通过 NSLog 转储它们即可验证这一点,因为在记录时会显示临时对象 ID。

    要强制它们永久存在并因此可用,请在执行添加后尝试以下操作。假设您有一个 UIManagedDocument 作为 ivar:

    - (void)performUpdate
    {
        NSManagedObjectContext * context = self.managedDocument.managedObjectContext;
        NSSet                  * inserts = [context insertedObjects];
    
        if ([inserts count])
        {
            NSError * error = nil;
    
            if ([context obtainPermanentIDsForObjects:[inserts allObjects]
                                                error:&error] == NO)
            {
                NSLog(@"BAM! %@", error);
            }
        }
    
        [self.managedDocument updateChangeCount:UIDocumentChangeDone];
    }
    

    显然,您可以在这里用更好的方法替换错误处理。 UIManagedDocument 现在将在将来的某个时间保存(同样,您完全无法控制何时会发生,我们只是在最后一行要求它这样做,就像撤消管理器一样) ,但新插入的对象现在应该具有可用的永久 id,并且 fetch 应该可以正常工作。

    是的,这对我来说也有点奇怪,但这似乎是使用 UIManagedDocument 做事的正确方法。

    坦率地说,我很想有人告诉我我错了并提供更好的解决方案。

    【讨论】:

    • 艾伦,谢谢!这花费了我很多时间或旋转我的轮子。正如您所说,这似乎不是我阅读的所有教程和说明中的“必需”步骤,但它使我的应用程序正常工作。
    • 如果有人知道如何避免使用它,我也很高兴听到。
    • 我认为目前还没有 Apple 提供的 UIManagedDocument 示例代码有点说明问题。我认为这可能是由于新的嵌套托管对象上下文而引入的意外错误,他们正在等待修复它,然后再提供示例代码。无论如何,一个书呆子的理论。
    • 另外请注意,如果您阅读文档足够长的时间,您会碰巧看到一个句子表明 updateChangeCount: 实际上是保存托管文档的唯一且唯一正确的方法;保存上下文本身不是答案...从我的失败中学习,只需使用 updateChangeCount:.
    • 是否在 UIManagedDocument 上调用 saveToURL:forSaveOperation:completionHandler: 等效于此方法?
    猜你喜欢
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    相关资源
    最近更新 更多