核心数据获取请求失败:'NSInternalInconsistencyException',原因:'语句仍然处于活动状态'

核心date使用导航控制器模板的基本应用程序布局:

委托:persistenceCoordinator,managedObjectModel,managedObjectContext

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

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

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

  1. 创build一个addManagedObjectContext
  2. 插入一个实体
  3. 推入添加/编辑视图(通过它插入的实体)

例外步骤1:

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

  • 该对象被插入到数据库中(通过命令行上的sqlite3validation)
  • fetchResultsController更新列表视图
  • 我可以closures并打开应用程序(完全closures/打开不只是应用程序切换),列表视图将重新获取正确

如果我然后编辑A,我可以select添加B和添加B视图被推上(并通过A实体)

  • 填写B的细节并保存
  • 将B插入到A的managedObjectContext中,设置关系,并保存上下文
  • 视图popup,一切都很好
  • 这些对象都在数据库中,并具有正确的关系
  • 我可以重新加载logging并查看关系,进行编辑等
  • 例外:如果我closures/重新打开应用程序,以触发一个提取,那么标题中提到的错误将会发生。

例外步骤2:

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

  • 保存B触发完全保存A的上下文(如上)
  • 保存A通过模板设置的委托关系进行保存(并将结果合并到主要的managedObjectContext等)
  • 对象被正确地插入到数据库中
  • 但是,fetchResultsController不会更新以显示新的logging
  • 例外:如果我closures/重新打开应用程序,以触发一个提取,那么标题中提到的错误将会发生。

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

干杯,瑞安

这听起来像你有两个或更多的托pipe对象上下文,当你只需要一个。

我不知道为什么你会在RootViewController中有一个叫做addManagedObjectContext的方法,或者它会做什么。 除了最复杂的devise之外,您一次只有一个上下文,并且不会重叠。 上下文应由应用程序委托或专用模型对象保存。 每当你打开一个特定的视图,你永远不会创build一个新的上下文。

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

这个错误通常与线程相关,可能意味着某些东西在另一个线程上仍在处理中。 在我的情况下,我在pipe理对象的init中做了一些愚蠢的事情(不要覆盖init;))。