Iphone 核心数据提取请求失败,错误为:';n内部一致性异常';,原因:';语句仍处于活动状态';

Iphone 核心数据提取请求失败,错误为:';n内部一致性异常';,原因:';语句仍处于活动状态';,iphone,core-data,ios,Iphone,Core Data,Ios,使用导航控制器模板和核心日期的基本应用程序布局: 代理:persistenceCoordinator、managedObjectModel、managedObjectContext RootView:managedObjectContext(来自委托)、addManagedObjectContext(使用模板中的模式)、fetchResultsController 添加/编辑视图(用于添加对象a及其B的层次结构) 我有两个对象,A和B共享一对一关系/反向关系 使用应用程序模板中的模式:

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

代理:persistenceCoordinator、managedObjectModel、managedObjectContext

  • RootView:managedObjectContext(来自委托)、addManagedObjectContext(使用模板中的模式)、fetchResultsController
    • 添加/编辑视图(用于添加对象a及其B的层次结构)
我有两个对象,A和B共享一对一关系/反向关系

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

  • 创建addManagedObjectContext
  • 在实体中插入
  • 按下“添加/编辑视图”(已将插入的图元传递给视图)
  • 例外情况步骤1:

    如果我只是简单地填写A属性并保存,那么一切都可以正常工作

    • 该对象将插入到 数据库(使用上的sqlite3验证) (命令行)
    • fetchResultsController将更新 列表视图
    • 我可以关闭和打开应用程序(完整) 关闭/打开(不仅仅是应用程序开关)和 列表视图将正确重新获取
    如果我随后编辑A,我可以选择添加B,并打开添加B视图(并传递A实体)

    • 填写B详细信息并保存
    • B被插入到A的 managedObjectContext 关系已设置,并且上下文 得救
    • 视图弹出,所有显示 嗯
    • 对象都在数据库中 有正确的关系
    • 我可以重新加载该记录并查看 关系、编辑等
    • 例外情况:如果我关闭/重新打开应用程序, 以便触发提取,然后 标题中提到的错误将被删除 发生
    例外情况步骤2:

    如果我在首字母“add”中填写A属性和B属性

    • 保存B将触发a的完全保存 上下文(如上所述)
    • 保存代理将通过代理进行保存 由模板设置的关系 (并将结果合并到主managedObjectContext等)
    • 这些对象将插入到 数据库正确
    • 但是,fetchResultsController 不更新以显示新的 记录
    • 例外情况:如果我关闭/重新打开应用程序, 以便触发提取,然后 标题中提到的错误将被删除 发生
    我试着先保存A,为B添加一个单独的上下文,等等。至少可以说,我很困惑。任何帮助都将不胜感激

    干杯,
    Ryan

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

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


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

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

    拥有一个添加上下文将所有更改保留在主上下文之外,直到您合并它们。这完全合理。问题是我的一个托管对象的线程问题。与应用程序的上下文或流程无关的愚蠢错误。无论如何,谢谢你。我很欣赏你的想法。对不起,从方法名称来看,我以为你是在“添加另一个上下文”,而没有“添加对象的上下文”。为了未来读者的利益,您可能需要编辑您的问题以反映这一点。拥有多个上下文来丢弃对象充其量只是一种边缘情况。这并非“完全合理”,但不幸的是,这是一个糟糕的例子,存在于一个苹果示例源代码项目中<代码>NSUndoManager是在扔掉的情况下应该使用的工具。@Marcus S.Zarra——是的,我从未理解苹果和其他公司在非线程情况下使用的上下文的多样性。顺便说一句,我很喜欢你的书。我同意马库斯(在twitter上讨论并阅读了他的书之后)的观点,也同意TechZen的观点。我使用这个模式是基于上面提到的来自苹果的示例代码。但是,如果您确实需要一个单独的上下文(我不需要,您可能也不需要),这里还有一个关于线程的课程。:)这是我的问题,尽管我的线程是正确的,但我正在重写NSManagedObject的initialize方法,这会破坏一切。