Iphone 核心数据提取请求失败,错误为:';n内部一致性异常';,原因:';语句仍处于活动状态';
使用导航控制器模板和核心日期的基本应用程序布局: 代理:persistenceCoordinator、managedObjectModel、managedObjectContextIphone 核心数据提取请求失败,错误为:';n内部一致性异常';,原因:';语句仍处于活动状态';,iphone,core-data,ios,Iphone,Core Data,Ios,使用导航控制器模板和核心日期的基本应用程序布局: 代理:persistenceCoordinator、managedObjectModel、managedObjectContext RootView:managedObjectContext(来自委托)、addManagedObjectContext(使用模板中的模式)、fetchResultsController 添加/编辑视图(用于添加对象a及其B的层次结构) 我有两个对象,A和B共享一对一关系/反向关系 使用应用程序模板中的模式:
- RootView:managedObjectContext(来自委托)、addManagedObjectContext(使用模板中的模式)、fetchResultsController
- 添加/编辑视图(用于添加对象a及其B的层次结构)
- 该对象将插入到 数据库(使用上的sqlite3验证) (命令行)
- fetchResultsController将更新 列表视图
- 我可以关闭和打开应用程序(完整) 关闭/打开(不仅仅是应用程序开关)和 列表视图将正确重新获取
- 填写B详细信息并保存
- B被插入到A的 managedObjectContext 关系已设置,并且上下文 得救
- 视图弹出,所有显示 嗯
- 对象都在数据库中 有正确的关系
- 我可以重新加载该记录并查看 关系、编辑等
- 例外情况:如果我关闭/重新打开应用程序, 以便触发提取,然后 标题中提到的错误将被删除 发生
- 保存B将触发a的完全保存 上下文(如上所述)
- 保存代理将通过代理进行保存 由模板设置的关系 (并将结果合并到主managedObjectContext等)
- 这些对象将插入到 数据库正确
- 但是,fetchResultsController 不更新以显示新的 记录
- 例外情况:如果我关闭/重新打开应用程序, 以便触发提取,然后 标题中提到的错误将被删除 发生
Ryan听起来好像您有两个或多个托管对象上下文,而您只需要一个 我不知道为什么在RootViewController中会有一个名为
addManagedObjectContext
的方法,或者它会做什么。在除了最复杂的设计之外的所有设计中,一次只有一个上下文,并且它们不会重叠。上下文应由应用程序委托或专用模型对象保存。您永远不会在每次打开特定视图时创建新上下文
您可以将不同的上下文全部写入同一个持久性存储,因此我认为这就是您在存储中看到数据的原因。但是,如果将关系中的一个对象放在一个上下文中,而将关系的另一端放在另一个上下文中,则无法跨上下文维护图形完整性。我相信这就是造成你的错误的原因 此错误通常与线程相关,可能意味着其他线程仍在处理某些内容。在我的例子中,我在一个托管对象的init中做了一些愚蠢的事情(不要覆盖init;)。拥有一个添加上下文将所有更改保留在主上下文之外,直到您合并它们。这完全合理。问题是我的一个托管对象的线程问题。与应用程序的上下文或流程无关的愚蠢错误。无论如何,谢谢你。我很欣赏你的想法。对不起,从方法名称来看,我以为你是在“添加另一个上下文”,而没有“添加对象的上下文”。为了未来读者的利益,您可能需要编辑您的问题以反映这一点。拥有多个上下文来丢弃对象充其量只是一种边缘情况。这并非“完全合理”,但不幸的是,这是一个糟糕的例子,存在于一个苹果示例源代码项目中<代码>NSUndoManager是在扔掉的情况下应该使用的工具。@Marcus S.Zarra——是的,我从未理解苹果和其他公司在非线程情况下使用的上下文的多样性。顺便说一句,我很喜欢你的书。我同意马库斯(在twitter上讨论并阅读了他的书之后)的观点,也同意TechZen的观点。我使用这个模式是基于上面提到的来自苹果的示例代码。但是,如果您确实需要一个单独的上下文(我不需要,您可能也不需要),这里还有一个关于线程的课程。:)这是我的问题,尽管我的线程是正确的,但我正在重写NSManagedObject的initialize方法,这会破坏一切。