核心数据:非法尝试建立关系+(空)上下文

Posted

技术标签:

【中文标题】核心数据:非法尝试建立关系+(空)上下文【英文标题】:Core Data: Illegal attempt to establish relationship + (null) context 【发布时间】:2010-12-01 00:03:53 【问题描述】:

我正在后台线程上解析数据,插入新实体并与其他现有实体建立关系。

有时我会收到错误消息:'尝试在不同上下文中建立对象之间的关系'。

阅读更多相关信息后,我现在正在后台线程中创建一个新的 ManagedObjectContect,并使用它来插入新实体并设置关系。我小心翼翼地只在我的后台线程中使用这个新的 ManagedObjectContext。当我需要找到一个现有实体来建立现有对象和这些新对象之一之间的关系时,我调用 [moc objectWithId:id] 以使用我的新 moc 获取现有对象。但是,我仍然收到错误消息。

沮丧,我开始打印东西。我注意到,当我为每个 NSManagedObject 打印出 managedObjectContext 属性时,就在建立关系之前,有时会打印出“(null)”。这似乎是问题发生的时候。

谁能告诉我我做错了什么?为什么有时我的对象上有 (null) mocs?

感谢您提供的任何帮助!

【问题讨论】:

如果不包含回溯和代码,就无法诊断此问题。 【参考方案1】:

最可能的解释是您试图链接到在一个上下文中创建的尚未与另一个上下文合并的对象。在上下文合并之前,在一个上下文中所做的任何更改都不会显示在另一个上下文中。这就是您的错误消息告诉您的内容。

Null 对象很可能是由使用临时对象 ID 引起的。在对象被保存到持久存储之前,objectID 是不固定的。在此之前,它有一个临时 ID,在保存时会更改。

【讨论】:

【参考方案2】:

我们需要查看您的一些代码。我的第一个想法是检查您是通过其属性还是直接访问 managedObjectContext ?

如果您使用 Apple 提供的模板核心数据方法,则通过属性访问它可以确保在创建新托管对象时上下文始终可用(即不为零)。

【讨论】:

Rog,要检查 managedObjectContext 属性,我只是在记录 [entity managedObjectContext]。这就是有时返回 '(null)' 的原因。 没有看到你的代码就无法帮助你,对不起!【参考方案3】:

NSmanagedObject 有一个叫做isInserted 的方法,它确认一个对象是否已经被插入到一个managedObjectContext 中检查这个值,如果没有使用NSManagedObjectContext 上的insert 方法来插入它。

【讨论】:

Jonathan,新实体已插入 moc。我试图关联的现有实体已经在持久存储中。 您可能需要做的是合并两个对象上下文。调查 NSManagedObjectContext 的 mergeChangesFromContextDidSaveNotification:。另请查看核心数据手册示例和 marcus zara 的核心数据手册。我发现后者是应对这种情况的值得投资。

以上是关于核心数据:非法尝试建立关系+(空)上下文的主要内容,如果未能解决你的问题,请参考以下文章

保存导致“非法建立关系的尝试......”

为啥我会得到:非法尝试在不同上下文中的对象之间建立关系...

非法尝试在不同上下文中的对象之间建立关系“清单”

NSInvalidArgumentException:非法尝试在不同上下文中的对象之间建立关系

单一上下文但“非法尝试在不同上下文中的对象之间建立关系‘xyz’

非法尝试在不同上下文中的对象之间建立关系“对象”