核心数据获取请求失败:'NSInternalInconsistencyException',原因:'语句仍然处于活动状态'
核心date使用导航控制器模板的基本应用程序布局:
委托:persistenceCoordinator,managedObjectModel,managedObjectContext
- RootView:managedObjectContext(来自委托),addManagedObjectContext(使用来自模板的模式),fetchResultsController
- 添加/编辑视图(添加对象A及其B的层次结构)
我有两个对象,A和B共享一对一的关系/反向关系
从模板中使用模式的应用程序:
- 创build一个addManagedObjectContext
- 插入一个实体
- 推入添加/编辑视图(通过它插入的实体)
例外步骤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;))。