核心数据获取请求失败:'NSInternalInconsistencyException',原因:'statement is still active'

Posted

技术标签:

【中文标题】核心数据获取请求失败:\'NSInternalInconsistencyException\',原因:\'statement is still active\'【英文标题】:Core Data fetch request fails with: 'NSInternalInconsistencyException', reason: 'statement is still active'核心数据获取请求失败:'NSInternalInconsistencyException',原因:'statement is still active' 【发布时间】:2010-06-20 04:08:00 【问题描述】:

使用带有核心日期的导航控制器模板的基本应用布局:

委托:persistenceCoordinator、managedObjectModel、managedObjectContext

RootView:managedObjectContext(来自委托)、addManagedObjectContext(使用模板中的模式)、fetchResultsController 添加/编辑视图(用于添加对象 A 及其 B 的层次结构)

我有两个对象 A 和 B,它们共享一对一关系/反向关系

使用应用程序模板中的模式:

    创建一个 addManagedObjectContext 插入一个 A 实体 推动添加/编辑 A 视图(已将插入的实体传递给它)

例外步骤 1:

如果我只是填写 A 属性并保存一切正常。

对象被插入到 数据库(使用 sqlite3 验证 命令行) fetchResultsController 更新 列表视图 我可以关闭和打开应用程序(完整 关闭/打开不仅仅是应用程序开关)和 列表视图将正确重新获取

如果我然后编辑 A,我可以选择添加 B 并推送添加 B 视图(并传递 A 实体)

填写B详细信息并保存 B 被插入到 A 中 managedObjectContext, 关系已设置,上下文 已保存 视图弹出并全部显示 好 对象都在数据库中 正确的关系 我可以重新加载记录并查看 关系,进行编辑等 例外:如果我关闭/重新打开应用程序, 以便触发提取,然后 标题中提到的错误将 发生。

例外步骤 2:

如果我在初始“添加”中填写A属性和B属性

保存 B 会触发 A 的完全保存 上下文(如上) 保存 A 通过委托保存 模板建立的关系 (并将结果合并到主 managedObjectContext 等) 对象被插入到 数据库正确 但是 fetchResultsController 不更新以显示新的 记录 例外:如果我关闭/重新打开应用程序, 以便触发提取,然后 标题中提到的错误将 发生。

我尝试先保存 A,然后为 B 等添加单独的上下文。至少可以说我很困惑。任何帮助将不胜感激。

干杯, 瑞恩

【问题讨论】:

【参考方案1】:

当您只需要一个时,听起来您有两个或多个托管对象上下文。

我不知道为什么在 RootViewController 中有一个名为 addManagedObjectContext 的方法,或者它会做什么。在除最复杂的设计之外的所有设计中,您一次只有一个上下文并且它们不重叠。上下文应由应用程序委托或专用模型对象持有。每次打开特定视图时,您永远不会创建新的上下文。

您可以将不同的上下文都写入同一个持久存储,所以我认为这就是您在存储中看到数据的原因。但是,如果将一个对象放在一个上下文中的关系中,而将关系的另一侧放在另一个上下文中,则无法跨上下文保持图形完整性。我相信这就是产生错误的原因。

【讨论】:

拥有一个添加上下文可以将所有更改保留在主上下文之外,直到您合并它们。这是完全合理的。问题是我的一个托管对象的线程问题。与应用程序的上下文或流程无关的愚蠢错误。不管怎么说,还是要谢谢你。我很欣赏这些想法。 抱歉,按照方法名称,我认为您是在“添加另一个上下文”而不是“添加对象的上下文”。为了未来读者的利益,您可能需要编辑您的问题以反映这一点。 拥有多个上下文只是为了扔掉对象是一种 edge 的情况。这不是“完全合理”,但不幸的是,Apple 示例源项目之一中存在一个糟糕的例子。 NSUndoManager 应该用于丢弃情况。 @Marcus S. Zarra -- 是的,我从来不理解 Apple 和其他人在非线程案例中使用的上下文的多样性。顺便说一句,喜欢你的书。 我已经同意 Marcus(在 Twitter 讨论和阅读他的书之后)以及 TechZen 的扩展。我根据提到的 Apple 示例代码使用了这种模式。然而,如果你真的需要一个单独的上下文(我不需要,你可能也不需要),这里仍然有关于线程的课程。 :)【参考方案2】:

此错误通常与线程有关,可能意味着某些内容仍在另一个线程上处理。就我而言,我在托管对象的 init 中做了一些愚蠢的事情(不要覆盖 init ;))。

【讨论】:

这是我的问题,尽管我的线程是正确的,但我重写了 NSManagedObject 的初始化方法,这会破坏事情。

以上是关于核心数据获取请求失败:'NSInternalInconsistencyException',原因:'statement is still active'的主要内容,如果未能解决你的问题,请参考以下文章

核心数据简单获取请求模板

NSSortDescriptor 对核心数据获取请求没有影响

带有数组的核心数据获取请求

大型数据集上的核心数据获取请求缓慢

保存核心数据中断获取请求

获取复杂请求核心数据的谓词和表达式