保存父 NSManagedObjectContext 时出错

Posted

技术标签:

【中文标题】保存父 NSManagedObjectContext 时出错【英文标题】:Error when saving parent NSManagedObjectContext 【发布时间】:2014-08-06 14:47:21 【问题描述】:

我正在使用以下 MOC 设置:

    父级 - 使用持久存储协调器(主队列) 子 1 - 使用父(私有队列) Child2 - 使用父级(私有队列) Child3 - 使用父级(私有队列)

孩子们会定期保存他们的更改,并在需要时作为主 MOC 的新快照重生。

在我尝试保存主 MOC 之前,一切正常。这是我收到的错误消息:Cannot update object that was never inserted

未解决的错误 Error Domain=NSCocoaErrorDomain Code=134030 “操作无法完成。(Cocoa 错误 134030。)” UserInfo=0x1758e200 NSAffectedObjectsErrorKey=( " (实体: 事件; id: 0x1767d3d0 ; 数据: \n dateBegin = nil;\n dateEnd = nil;\n identifier = nil;\n identifierBegin = 0;\n isProcessed = 1;\n nPhotos = 0;\ n 名称 = nil;\n 照片 = \"\";\n)" ), NSUnderlyingException=无法更新从未插入的对象。,

它不会一直发生,移除耗时的操作会降低它发生的频率。我还注意到,在异常期间,其他 MOC 正忙于保存或查询。我使用 performBlockperformBlockAndWait 让所有与 MOC 相关的操作在正确的队列上运行。

如果相关,child1 导入基础对象,child2 创建事件,child3 处理事件并更新 Event 和基础对象。 parent 用于将 tge 数据持久化到磁盘并更新 UI。消除使用child3 的线程可以解决问题,但我不相信这不是时间问题。

你知道为什么会这样吗?

编辑

我想我找到了问题的根源。现在正在寻找解决方案。

child3 更新了 Event 并尝试将更改保存到 parent,而 child2 决定删除 Event 并已保存此更改。保存是试图更新一个不存在的对象。奇怪的是,只有当我尝试将parent 保存到 PSC 时才会出现错误。

【问题讨论】:

Qu.1 - 您是否考虑过为“导入基础对象”、“创建事件”和“处理事件和更新...”任务使用单个 NSManagedObjectContext? Qu.2 - 你有没有考虑过使用堆叠的performBlockAndWait,所以child1必须先保存,然后child2,然后child3 #1 - 这是我用作解决方法的方法。它有效,但它增加了任务之间的耦合。此外,当 task1 保存上下文时,task2 的中间更改也会被保存,这会影响 UI 和其他 CoreData 消费者。 #2 在我的情况下,任务不知道彼此。 虽然任务彼此不了解,但它们以特定顺序完成是否重要,因为有必要的关系来填充NSManagedObject,至少在child3 (事件和基础对象更新)? 【参考方案1】:

我刚刚得到相同的错误消息,在我的情况下,问题在于存储对临时(不是在保存上下文后生成的永久)ObjectID 的引用,试图从另一个上下文(objectWithID:) 获取对象id 然后对该对象执行更改。保存方法给了我同样的结果。

您是否有机会通过引用 ObjectID 来访问上下文之间的对象?

【讨论】:

以上是关于保存父 NSManagedObjectContext 时出错的主要内容,如果未能解决你的问题,请参考以下文章

保存子窗口会保存父窗口(Javascript)

子父上下文保存冲突

NSFetchedResultsController,修改NSFetchRequest?

核心数据父/子上下文保存失败

Fluent NHibernate - 用新的 List<object> 子对象保存新的父对象

Django 抽象父模型保存覆盖