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

时间:2010-06-20 04:08:01

标签: iphone core-data ios

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

委托:persistenceCoordinator,managedObjectModel,managedObjectContext

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

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

使用app模板中的模式:

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

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

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

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

    • 填写B详细信息并保存
    • B插入A中 managedObjectContext ,. 设置关系,以及上下文 已保存
    • 视图弹出,全部显示 井
    • 对象都在数据库中 与正确的关系
    • 我可以重新加载记录并查看 关系,编辑等
    • 例外:如果我关闭/重新打开该应用, 这样才能触发取指令 标题中提到的错误 发生。

    EXCEPTION STEPS 2:

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

    • 保存B会触发完整的A保存 上下文(如上所述)
    • 通过委托保存A保存 由模板建立的关系 (并将结果合并到主要的managedObjectContext等)
    • 将对象插入到 数据库正确
    • 但是fetchResultsController 不会更新以显示新的 记录
    • 例外:如果我关闭/重新打开该应用, 这样才能触发取指令 标题中提到的错误 发生。

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

    干杯, 莱恩

2 个答案:

答案 0 :(得分:4)

听起来你只需要一个托管对象上下文。

我不知道为什么你会在RootViewController中有一个名为addManagedObjectContext的方法或它会做什么。除了最复杂的设计之外,您一次只能有一个上下文,它们不会重叠。 context / s应该由app delegate或专用模型对象持有。每次打开特定视图时,都不会创建新的上下文。

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

答案 1 :(得分:3)

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