独立开发之 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 数据库中的内容翻译才能算完成。

相关推荐
2501_9160088936 分钟前
iOS App 图标、启动屏和多语言搭配 方法,上架前使用KXBuild一次做好 App 图标
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
2501_9159184143 分钟前
iOS 推送通知怎么实现,从 APNs p8 密钥到 iOS 真机收到第一条推送
vscode·ios·objective-c·个人开发·swift·敏捷流程
东坡肘子1 小时前
快速消失的硬盘容量 -- 肘子的 Swift 周报 #160
人工智能·swiftui·swift
茶底世界之下21 小时前
雨夜街角裁成方图,人物与冷暖光还能共存吗?
ios
youdexiang1 天前
IOS录音APP拍照记录能和音频同步吗
ios·音视频
2501_915909061 天前
Windows 打开 Xcode 工程,编译调试 Xcode 项目并和 Mac 同事协作
ide·windows·vscode·macos·ios·个人开发·xcode
互联网江湖1 天前
iPhone Duo跌倒,国产折叠屏手机吃饱?
ios·智能手机·iphone
zwd20052 天前
词频是什么?生词滑块 zipf 3.0 到 5.0 怎么调:同一屏从 0 个生词到 11 个
ios·iphone·效率工具·英语学习·词频·屏幕翻译
茶底世界之下2 天前
灯暖窗冷,色温要不要继续降?用 Awaking 看混合光的取舍
ios
2501_916007472 天前
Windows OpenSSL 生成 iOS 证书,制作 p12 与描述文件,KXBuild 签名实操
windows·vscode·ios·objective-c·个人开发·swift·敏捷流程