关于我:大厂摸鱼 + 业余独立开发,之后会输出深度技术文章 + 独立开发技巧
我的往期技术文章合集:RickeyBoy - Gitbub
我的独立开发 App:iColors - 设计灵感 配色助手
上一篇:
🧙🏻♀️ Core Data 架构升级
数据内容准备好之后,接下来就是升级 Core Data 架构了,确保能够顺利的使用最新的数据。这里面最主要的就是 Core Data 的模型升级,因为毕竟在原有模型中新增了英文的名称,Core Data 的模型也需要做对应的适配:
什么是 schema migration
数据模型总有需要升级的时候!
所谓 schema migration,其实就是数据模型升级。使用 Core Data 来管理数据时,肯定有需要对模型进行升级的时候,比如给模型添加新属性、删除属性、修改属性类型等等。而我就以给 Core Data 模型增加属性为例(也就是上面提到的,给中国传统色模型增加英文属性),来讲解当数据模型发生这些更改。
那么为什么要进行数据升级呢,如果我直接给模型加一个新的属性不就行了么?这样肯定是不行的,App 肯定需要涉及到对旧版本的兼容,旧版本内容需要按照一定的规则过渡到新的内容。
具体而言,如果不进行 schema migration 升级操作:
- App 肯定无法正常运行,存在数据丢失、数据损坏等问题
- Core Data 会直接拒绝打开 persistent store,报错
NSPersistentStoreIncompatibleVersionHashError
比如,如果直接改模型,就会报错:
使用 Lightweight migration
Apple 其实已经为我们提供了一种非常方便且合理的升级方式,就是 Lightweight migration,如果想要进一步理解它,以及全方位理解 Core Data 数据结构的升级,可以看一下 WWDC22 的教学视频:WWDC22 - Evolve your Core Data schema
粗略来看他的原理的话,可以用视频中的原文来说明:
Lightweight migration is the preferred method of migration. Lightweight migration automatically analyzes and infers the migration from the differences between the source and destination managed object models.
At runtime, Core Data looks for the models in the bundles returned by .allBundles and .allFrameworks methods of the NSBundle class. Lightweight migration then generates a mapping model to materialize the changes you've made in your app in your database schema.
-- Evolve your Core Data schema
Lightweight migration 是首选的数据迁移方式,它能够自动推断出源模型和目标模型差别。在运行时,Core Data 会通过 NSBundle.allBundles、NSBundle.allFrameworks 中获取到所有的模型信息,然后 Lightweight migration 机制会自动根据这些模型,以及他们之间的映射关系等,来改变数据库中的源模型。
Lightweight migration 支持的能力
如上文所说,Lightweight migration 能够自动支持 Core Data Models 大部分类型的改变,那么到底包含多少类型呢?
首先是针对 Attributes 的能力:
English | 中文 |
---|---|
Adding | 新增属性 |
Removing | 移除属性 |
Non-optional becoming optional | 非 optional 变为 optional |
Optional becoming non-optional and defining default value | optional 变为非 optional,并指定默认值 |
Renaming | 重命名 |
注意:Core Data 能自动适配版本变动,如 V1->V2->V3 都有改动,也是没有问题,可以自动适配 v1->v3
其次是关于 Relationships 的能力:
English | 中文 |
---|---|
Adding | 新增关系 |
Removing | 移除关系 |
Renaming | 重命名 |
Cardinality changes | 数量关系改变 |
注意:Cardinality changes 指的是数据库关系中对应的数量变化,包括 1 对 1,1 对多,多对多。
最后是关于 Entities 的能力:
English | 中文 |
---|---|
Adding | 新增实体 |
Removing | 移除实体 |
Renaming | 重命名 |
Creating new parent or child entities | 创建新的父或子实体 |
Moving attributes within the entity hierarchy | 在实体层次结构中移动属性 |
Modifying the entity hierarchy | 修改实体层次结构 |
Cannot merge entity hierarchies | 无法合并实体层次结构 |
注意:Lightweight migration 并不能自动合并 entity 的结构!
实战操作
如果你仔细阅读理解了上面 Lightweight migration 的内容,就知道其实从实操上面来讲,你并不需要做什么事情。如果你使用的是 NSPersistentContainer,那么 Core Data 就能够自动实现这些功能。只需要我们定义清楚升级之后的模型就行了。
选中 Editor 然后选中 Add Model Version ,就可以创建一个新的 .xcdatamodel
文件,这样就算成功了
这样其实就创建了目标模型了,不过可以看到那个绿色的小勾勾 ✅ 现在还在旧 Model 上面,代表现在 App 还默认使用的是旧的模型。
不过没关系,我们先将 Model 2 进行修改,修改为我们我们希望升级到的新模型就可以了。比如我的例子中,就是新增一个 nameEn 的 Attribute:
好的,接下来就是将 Model 2 设置为默认。选中 Model 2,打开右侧 Inspectors 面板,然后选择 Current Model Version 就可以了:
可以看到,现在绿色的小勾勾 ✅ 转移到 Model 2 上面,就已经成功了!
国际化系列文章的第三篇,主要是简单描述一下对于如何升级和迁移 Core Data 的数据及模型。其实了解了原理之后,实操也并不复杂。接下来就是涉及到代码处理 Core Data 升级后的模型,然后开发和调试了!做完这些,App 数据库中的内容翻译才能算完成。