7

在将 iOS 6.0.1 上的 Core Data 托管对象上下文保存到 SQLite 存储时,我遇到了一个奇怪的“CoreData 不支持持久的跨存储关系”异常。它涉及模型中 Quotes 和 AbstractSources 之间的一对一关系。在运行时,它涉及 Quote 和 Book (其中 Book 继承自 AbstractSource。在模型编辑器中一切正常。)

我研究了类似的报告并涵盖了报告的原因:

  1. 我正在使用 assignObject:toPersistentStore: 将 Quote 和 Book 分配给同一个持久存储,因此两者都未分配。
  2. 错误描述显示所有“绝对”x-coredata id 都以相同的前缀开头(例如“x-coredata://82B3BEB3-60F2-4912-AC80-11AAD29CFF99/”,所以似乎只有一个商店在使用中.

我的问题是:

  1. 还有什么我需要检查的吗(也许 sg. 与 AbstractSource 相关,我没有在我的源中触摸/控制它?我正在通过调用 initWithEntity:insertIntoManagedObjectContext 来创建 Quote 和 Book 。)
  2. 我注意到错误描述还包括几个“相对”x-coredata id(形式为“x-coredata:///...”)。难道绝对形式总是被认为是“跨数据库”,即使“绝对”前缀(见上面的例子)是一样的?如果是这样,我如何影响“绝对”和“相对”x-coredata id 之间的任何选择?

谢谢(非常)您的关注!

4

1 回答 1

1

所以这就是(大概)造成麻烦的原因:

  1. 我的托管对象上下文的协调器必须管理两个持久存储。现在,我分配 Quote 和 Book 并希望它们保存的那个在启动时被重置。此代码中有一个错误,导致该商店无法使用。由于第二个可用,它默默地接管了,在这种情况下会导致不需要的结果。教训:我现在断言在设置核心数据堆栈后确实有/仍然有两个商店。
  2. 在我的 Core Data 模型的早期开发过程中,我在模型编辑器中重命名了它的一些实体。错误地,我只更改了名称,但没有更改实体类属性。因此,实际上,虽然模型编辑器中的一切运行良好,但在运行时使用了当时意外的类,因此意外的类也分配给了意外/错误的存储。教训:我现在确保实体名称和它们的类属性保持完美同步(其他情况允许)。

问题现已解决,我还重构了我的代码/模型以使用(非重叠)配置而不是显式分配,这也应该有助于前进。

再次感谢您的关注

于 2012-12-02T17:42:44.103 回答