尽管匹配x-coredata id,"CoreData不支持持久的跨店关系"

Dru*_*rux 7 sqlite core-data ios

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

我研究了类似的报告,并报道了报道的原因:

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

我的问题是这些:

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

Thx(很多)引起你的注意!

Dru*_*rux 1

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

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

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

再次感谢您的关注