核心数据迁移要求

Posted

技术标签:

【中文标题】核心数据迁移要求【英文标题】:Core Data migrations requirements 【发布时间】:2021-03-03 06:51:40 【问题描述】:

我有几个关于 Core Data 迁移的问题,我似乎无法找到答案。

    我正在对我的 Core Data 模型文件进行一些小改动... 专门改变一些“变压器” 可转换的属性,从空白到 NSSecureUnarchiveFromData (摆脱关于 NSKeyedUnarchiveFromDataTransformerName)。我需要创建一个 新模型并为此进行轻量级迁移?或者这不是 影响模型中的任何内容? 在 Xcode12.2 中,如果我对模型进行了更改(例如添加属性或新实体),并且我创建新的模型版本,只运行应用程序......它不会崩溃!它过去总是抛出“找不到源存储模型”错误。最近这方面有什么变化吗?还是我做错了什么?

谢谢。

【问题讨论】:

【参考方案1】:

Core Data 通过比较版本哈希来决定是否需要模型迁移。数据模型有一个,当您创建持久存储时,该版本哈希保存在存储文件中。只要它们不同,就需要迁移。迁移后,存储文件的哈希值会更新以匹配新模型。

版本哈希唯一重要的是影响 SQLite 数据库设置方式的因素。如果更改某些内容意味着 SQLite 架构更改,那么版本哈希会更改。这不包括转换器名称。如果您对详细说明感兴趣,请查看NSEntityDescription、NSPropertyDescription、NSAttributeDescription 和NSRelationshipDescription 上的versionHash 属性

如果您出于某种原因想要强制迁移,也可以添加自己的版本哈希修饰符字符串来强制更改版本哈希。

对于简单的迁移,Core Data 比以前更加宽容。默认情况下,具有自动映射模型生成的轻量级迁移处于活动状态(shouldMigrateStoreAutomaticallyshouldInferMappingModelAutomatically 默认情况下都是 true)。除非您专门将其关闭,否则轻量级迁移只会在需要时发生。保留不同的模型版本仍然是一个好主意,如果只是为了跟踪项目随时间的变化,但如果你不这样做,它通常也能正常工作。

【讨论】:

谢谢。对于迁移,我做了一些研究,“模型缓存”从 WWDC2015 开始,适用于 ios9 / 10.11:developer.apple.com/videos/play/wwdc2015/220

以上是关于核心数据迁移要求的主要内容,如果未能解决你的问题,请参考以下文章

在非连续版本之间迁移时出现核心数据迁移错误

核心数据模型迁移

核心数据版本控制和迁移

核心数据迁移问题:“持久存储迁移失败,缺少源托管对象模型。”

核心数据迁移删除实体数据

迁移复杂的核心数据模型