【问题标题】:Core Data migrations requirements核心数据迁移要求
【发布时间】:2021-03-03 06:51:40
【问题描述】:
我有几个关于 Core Data 迁移的问题,我似乎无法找到答案。
- 我正在对我的 Core Data 模型文件进行一些小改动...
专门改变一些“变压器”
可转换的属性,从空白到 NSSecureUnarchiveFromData
(摆脱关于
NSKeyedUnarchiveFromDataTransformerName)。我需要创建一个
新模型并为此进行轻量级迁移?或者这不是
影响模型中的任何内容?
- 在 Xcode12.2 中,如果我对模型进行了更改(例如添加属性或新实体),并且我不创建新的模型版本,只运行应用程序......它不会崩溃!它过去总是抛出“找不到源存储模型”错误。最近这方面有什么变化吗?还是我做错了什么?
谢谢。
【问题讨论】:
标签:
core-data
core-data-migration
【解决方案1】:
Core Data 通过比较版本哈希来决定是否需要模型迁移。数据模型有一个,当您创建持久存储时,该版本哈希保存在存储文件中。只要它们不同,就需要迁移。迁移后,存储文件的哈希值会更新以匹配新模型。
版本哈希唯一重要的是影响 SQLite 数据库设置方式的因素。如果更改某些内容意味着 SQLite 架构更改,那么版本哈希会更改。这不包括转换器名称。如果您对详细说明感兴趣,请查看NSEntityDescription、NSPropertyDescription、NSAttributeDescription 和NSRelationshipDescription 上的versionHash 属性
如果您出于某种原因想要强制迁移,也可以添加自己的版本哈希修饰符字符串来强制更改版本哈希。
对于简单的迁移,Core Data 比以前更加宽容。默认情况下,具有自动映射模型生成的轻量级迁移处于活动状态(shouldMigrateStoreAutomatically 和 shouldInferMappingModelAutomatically 默认情况下都是 true)。除非您专门将其关闭,否则轻量级迁移只会在需要时发生。保留不同的模型版本仍然是一个好主意,如果只是为了跟踪项目随时间的变化,但如果你不这样做,它通常也能正常工作。