从新的子上下文中删除对象

Posted

技术标签:

【中文标题】从新的子上下文中删除对象【英文标题】:Deleting object from fresh child context 【发布时间】:2016-03-24 22:40:33 【问题描述】:

时,我有一个奇怪的行为。

我有一个使用主队列的托管对象上下文。 我从中获取对象列表。 我使用私有队列创建新上下文。 我将其父级设置为主要上下文。

当然,我不能尝试直接从子上下文中的列表中删除对象。所以我使用 existingObjectWithID: 从子上下文中创建一个“等效”对象列表。 Core Data 告诉我他找不到那些对象:

错误域:NSCocoaErrorDomain 代码:133000

尝试访问未在商店中找到的对象。

没有额外的错误信息

当然,我不能删除它们。

现在,如果我获取子上下文中的对象列表,它们会被找到并且我可以删除它们(但那是作弊,我不应该知道如何获取此列表)。

有什么诀窍???如果对象(尚未)在子上下文中,existingObjectWithID: 是否应该从父上下文中获取?

【问题讨论】:

mainQueueContext 直接附加到NSPersistentStoreCoordinator(坏主意)。 没有诀窍。在此处查看类似问题:[link] (***.com/questions/22511745/…)。 谢谢。该链接确实完全描述了我遇到的问题。好吧,我想我必须重新考虑我的堆栈架构和上下文的生命周期。 【参考方案1】:

假设这些对象已经保存,而不是临时对象,它们的行为有点不同。

如果您知道对象已经存在,您可以使用objectWithID 而不是existingObjectWithID。请注意,您总是会以这种方式取回一个对象,但它可能无效,因此您必须检查。

尽管所有文档都说父上下文的行为类似于子上下文的永久后备存储,但实际上它并不能以这种方式工作 - 这就是为什么直接从子上下文中获取对象对您有用的原因。

【讨论】:

谢谢。实际问题更接近 Khundragpan 的上述评论。事实上,由于主要的上下文保存是异步完成的,我无法确定对象何时被保存。我将重新考虑我的堆栈和 y 上下文的生命周期。【参考方案2】:

Tom Harrington 在这篇文章 (Cannot retrieve temporary object in child context with existingObjectWithID:error:) 中的回答完全解释了这个问题。

对我来说唯一的解决方案是重新考虑上下文堆栈和上下文生命周期。

【讨论】:

以上是关于从新的子上下文中删除对象的主要内容,如果未能解决你的问题,请参考以下文章

无法在具有现有ObjectWithID 的子上下文中检索临时对象:错误:

Canvas

在 SwiftUI 主体中出错的子上下文上创建核心数据实体

无法删除其他上下文中的对象

RelayJS:查询任意数据的子组件

如何删除子托管对象上下文中的临时对象?