【发布时间】:2011-01-16 11:39:09
【问题描述】:
我在 iPhone 应用程序上使用核心数据。我有多个持久性商店,我正在从一个切换到另一个,因此当时只有一个商店可以处于活动状态。我有一个托管对象上下文,不同的持久存储在数据格式(sqlite)上相似,并且共享相同的托管对象模型。
我正在将数据从各自的 XML 文件导入到每个持久性存储中。第一次导入一切正常,但是在我删除导入的数据(持久存储和物理文件)然后重新导入后,核心数据给了我一个错误:
*** Terminating app due to uncaught exception 'NSObjectInaccessibleException', reason: 'The NSManagedObject with ID:0x3c14e00 <x-coredata://6D14F11E-2EA7-4141-9BE8-53747DE6FCC6/Book/p2> has been invalidated.'
此错误来自 NSManagedObjectContext 的保存:在重新导入之前,我正在从持久存储协调器中删除持久存储并删除物理文件,所以一切都应该就像第一次完成重新导入一样。此外,托管对象上下文中的对象被删除,上下文被发送 reset: 消息(我不知道这是否真的需要)。
有人可以帮我吗?持久化存储应该如何切换?
我基本上使用与此处辅导相同的逻辑:http://blog.sallarp.com/iphone-core-data-uitableview-drill-down/
提前致谢。
目标更新
感谢您的回答。
抱歉,我的目标含糊不清。我正在开发一个圣经阅读器应用程序,它将从 XML 导入核心数据 SQL 的翻译。目前只能使用一种翻译。目前我对每个翻译只有不同的 MOC 和 PS,因为模型是相同的。但是,如果您说应该将堆栈作为一个整体创建,我确实相信。翻译之间没有联系,因此没有实际理由使用相同的堆栈。唯一可能使这复杂化的是注释/书签/等将引用活动翻译。但是,引用将是文本的,因此再次不需要共享堆栈。
感谢您的意见。
【问题讨论】:
-
创建一个新的上下文解决了这个问题。我不得不通过将两个参数、持久存储和托管对象上下文传递给导入器实例来更改一些逻辑,这最终是我发现关于可可通知的一件非常好的事情。无论如何,我要去寻找新的问题。再次感谢你们。
标签: iphone cocoa-touch core-data