独立开发之 App 国际化全步骤(三):Core Data 模型升级

关于我:大厂摸鱼 + 业余独立开发,之后会输出深度技术文章 + 独立开发技巧

我的往期技术文章合集:RickeyBoy - Gitbub

我的独立开发 App:iColors - 设计灵感 配色助手

上一篇:

独立开发之 App 国际化全步骤(一):为什么要做国际化

独立开发之 App 国际化全步骤(二):App 数据翻译

🧙🏻‍♀️ 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 数据库中的内容翻译才能算完成。

相关推荐
iOS民工4 小时前
iOS SSZipArchive 解压后 中文文件名乱码问题
ios
皮蛋很白8 小时前
IOS safari 播放 mp4 遇到的坎儿
前端·ios·safari·video.js
江上清风山间明月1 天前
Flutter DragTarget拖拽控件详解
android·flutter·ios·拖拽·dragtarget
Kaelinda1 天前
iOS开发代码块-OC版
ios·xcode·oc
ii_best2 天前
ios按键精灵自动化的脚本教程:自动点赞功能的实现
运维·ios·自动化
app开发工程师V帅2 天前
iOS 苹果开发者账号: 查看和添加设备UUID 及设备数量
ios
CodeCreator18182 天前
iOS AccentColor 和 Color Set
ios
iOS民工2 天前
iOS keychain
ios
m0_748238923 天前
webgis入门实战案例——智慧校园
开发语言·ios·swift
Legendary_0083 天前
LDR6020在iPad一体式键盘的创新应用
ios·计算机外设·ipad