尽管匹配 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 不支持持久的跨存储关系”的主要内容,如果未能解决你的问题,请参考以下文章

核心数据对象id格式

EF Core SQLite 错误 19:尽管配置了一对多,但“外键约束失败”

Entity Framework Core:外键和引用表 Id 列不匹配

尽管匹配宽度/高度约束,但启动屏幕故事板中的图像不可见

NVRM:尽管客户端和内核版本相同,但 API 不匹配

例外:尽管范围是从数据创建的,但数据中的列数与范围中的列数不匹配