尽管匹配 x-coredata id,但“CoreData 不支持持久的跨存储关系”
Posted
技术标签:
【中文标题】尽管匹配 x-coredata id,但“CoreData 不支持持久的跨存储关系”【英文标题】:"CoreData does not support persistent cross-store relationships" despite matching x-coredata ids 【发布时间】:2012-12-01 22:58:41 【问题描述】:在将 ios 6.0.1 上的 Core Data 托管对象上下文保存到 SQLite 存储时,我遇到了一个奇怪的“CoreData 不支持持久的跨存储关系”异常。它涉及模型中 Quotes 和 AbstractSources 之间的一对一关系。在运行时,它涉及 Quote 和 Book(其中 Book 继承自 AbstractSource。在模型编辑器中一切正常。)
我研究了类似的报告并涵盖了报告的原因:
-
我将 Quote 和 Book 分配给同一个持久
使用 assignObject:toPersistentStore: 存储,所以两者都不存在
未分配。
错误描述显示所有“绝对”x-coredata ids 开始
具有相同的前缀(例如
“x-coredata://82B3BEB3-60F2-4912-AC80-11AAD29CFF99/”,所以有
真的好像只有一间店在用。
我的问题是:
-
还有什么我需要检查的(也许 sg. 与
AbstractSource,我没有在我的源代码中触摸/控制它?我是
通过调用创建 Quote 和 Book
initWithEntity:insertIntoManagedObjectContext 每个。)
我注意到错误描述还包括几个
“相对”x-coredata id(形式为“x-coredata:///...”)。可以
是绝对形式总是被认为是
“跨数据库”,即使“绝对”前缀(参见上面的示例)相同?
如果是这样,我怎么能影响“绝对”和“绝对”之间的任何选择?
“相对”x-coredata id?
感谢(非常)您的关注!
【问题讨论】:
+1 是一个写得很好的问题。 x-coredata://82B3BEB3-60F2-4912-AC80-11AAD29CFF99/ = 尚未保存的对象的临时 ID @Daij-Djan thx (Danke) 进行澄清。我仍然假设 id (82B3BEB3-60F2-4912-AC80-11AAD29CFF99) 表示在保存时将使用哪个持久存储,并且 Quote 和 Bock 的 id 都是相同的。 我不知道如何查看基于该 ID 使用的持久存储。 (Ich habe aber keinen Plan!)..也许......不抱歉:D 【参考方案1】:所以这就是(大概)造成麻烦的原因:
-
我的托管对象上下文的协调器必须管理两个持久的
商店。现在是我分配报价单和书的那个,我是
希望他们保存在启动时重置。有一个错误
在这段代码中,这使得该商店无法使用。自从第二个
可用它默默地接管,在这种情况下会导致不需要的结果。
教训:我现在断言在设置核心数据堆栈后确实有/仍然有两个商店。
在我的核心数据模型的早期开发过程中,我重命名了一些
模型编辑器中的实体。错误地我只改变了
名称,但不是实体类属性。所以实际上同时
模型编辑器中的一切都运行良好,到那时出乎意料
类在运行时使用,因此意外的类在
也分配到意外/错误的商店。教训:我现在确定
实体名称及其类属性保持完美同步(其他
情况允许)。
问题现已解决,我还重构了我的代码/模型以使用(非重叠)configurations 而不是显式分配,这也应该有助于向前发展。
再次感谢您的关注
【讨论】:
以上是关于尽管匹配 x-coredata id,但“CoreData 不支持持久的跨存储关系”的主要内容,如果未能解决你的问题,请参考以下文章
EF Core SQLite 错误 19:尽管配置了一对多,但“外键约束失败”