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

Rya*_*ker 7 iphone core-data ios

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

委托:persistenceCoordinator,managedObjectModel,managedObjectContext

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

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

使用模板中的模式app:

  1. 创建addManagedObjectContext
  2. 插入A实体
  3. 按下添加/编辑视图(已将插入的实体传递给它)

例外步骤1:

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

  • 该对象被插入到数据库中(在命令行上使用sqlite3进行验证)
  • fetchResultsController更新列表视图
  • 我可以关闭并打开应用程序(完全关闭/打开而不仅仅是应用程序切换),列表视图将正确获取

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

  • 填写B详细信息并保存
  • 将B插入到A的managedObjectContext中,设置关系,并保存上下文
  • 视图弹出,一切都很好
  • 对象都在数据库中具有正确的关系
  • 我可以重新加载记录并查看关系,进行编辑等
  • 例外:如果我关闭/重新打开应用程序,以便触发提取,则会出现标题中提到的错误.

例外步骤2:

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

  • 保存B会触发A的上下文的完整保存(如上所述)
  • 通过模板设置的委托关系保存A保存(并将结果合并到主要的managedObjectContext等)
  • 对象正确插入数据库
  • 但是fetchResultsController不会更新以显示新记录
  • 例外:如果我关闭/重新打开应用程序,以便触发提取,则会出现标题中提到的错误.

我已经尝试先保存A,为B等添加单独的上下文.我很难说至少.任何帮助将不胜感激.

干杯,瑞恩

Tec*_*Zen 4

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

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

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