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

相关推荐
兔云程序1 小时前
消息称苹果iPhone系列将完全放弃LCD屏幕
ios·iphone
JackLee183 小时前
Metal 之旅之MTLLibrary
ios·metal·图形绘制·视频渲染·mtllibrary
missmisslulu1 天前
电容笔值得买吗?2024精选盘点推荐五大惊艳平替电容笔!
学习·ios·电脑·平板
GEEKVIP1 天前
手机使用技巧:8 个 Android 锁屏移除工具 [解锁 Android]
android·macos·ios·智能手机·电脑·手机·iphone
GEEKVIP1 天前
如何在 Windows 10 上恢复未保存/删除的 Word 文档
macos·ios·智能手机·电脑·word·笔记本电脑·iphone
奇客软件1 天前
iPhone使用技巧:如何恢复变砖的 iPhone 或 iPad
数码相机·macos·ios·电脑·笔记本电脑·iphone·ipad
奇客软件2 天前
如何从相机的记忆棒(存储卡)中恢复丢失照片
深度学习·数码相机·ios·智能手机·电脑·笔记本电脑·iphone
GEEKVIP2 天前
如何修复变砖的手机并恢复丢失的数据
macos·ios·智能手机·word·手机·笔记本电脑·iphone
一丝晨光2 天前
继承、Lambda、Objective-C和Swift
开发语言·macos·ios·objective-c·swift·继承·lambda
GEEKVIP3 天前
iPhone/iPad技巧:如何解锁锁定的 iPhone 或 iPad
windows·macos·ios·智能手机·笔记本电脑·iphone·ipad