版本记录
版本号 | 时间 |
---|---|
V1.0 | 2018.09.26 星期三 |
前言
数据是移动端的重点关注对象,其中有一条就是数据存储。CoreData是苹果出的数据存储和持久化技术,面向对象进行数据相关存储。感兴趣的可以看下面几篇文章。
1. iOS CoreData(一)
2. iOS CoreData实现数据存储(二)
3. Core Data详细解析(三) —— 一个简单的入门示例(一)
4. Core Data详细解析(四) —— 一个简单的入门示例(二)
5. Core Data详细解析(五) —— 基于多上下文的Core Data简单解析示例(一)
6. Core Data详细解析(六) —— 基于多上下文的Core Data简单解析示例(二)
When to Migrate - 何时需要迁移
首先看一下写作环境
Swift 4.2, iOS 12, Xcode 10
在应用程序开发期间,在发布日期之前,彻底的测试可以帮助消除数据模型。 但是,应用程序发布后应用程序使用、设计或功能的变化将不可避免地导致数据模型的变化。 那你怎么办呢?
您无法预测未来,但使用Core Data,您可以在应用的每个新版本中向未来迁移。 迁移过程将更新使用先前版本的数据模型创建的数据以匹配当前数据模型。
本教程将引导您完成笔记记录应用程序数据模型的演变,从而讨论Core Data迁移的许多方面。 您将从一个简单的应用程序开始,其数据模型中只有一个实体。
何时需要迁移? 这个常见问题的最简单答案是“当您需要对数据模型(data model)
进行更改时”。
但是,在某些情况下您可以避免迁移。 如果应用程序仅将Core Data用作脱机缓存,则在更新应用程序时,只需删除并重建数据存储即可。 只有当用户数据的真实来源不在数据存储中时,才可能这样做。 在所有其他情况下,您需要保护用户的数据。
也就是说,只要不改变数据模型就无法实现设计变更或功能请求,您就需要创建新版本的数据模型并提供迁移路径。
The Migration Process - 迁移过程
初始化Core Data
堆栈时,其中一个步骤是将存储添加到持久性存储协调器(persistent store coordinator)
。 当您遇到此步骤时,Core Data会在将存储添加到协调器之前执行一些操作。 首先,Core Data分析存储的模型版本。 接下来,它将此版本与协调器配置的数据模型进行比较。 如果存储的模型版本与协调器的模型版本不匹配,Core Data将在启用时执行迁移。
注意:如果未启用迁移,并且存储与模型不兼容,则Core Data将不会将存储附加到协调器,并使用适当的原因代码指定错误。
要启动迁移过程,Core Data需要原始数据模型和目标模型。它使用这两个版本来加载或创建迁移的映射模型,它用于将原始存储中的数据转换为可以存储在新存储中的数据。一旦Core Data确定了映射模型,迁移过程就可以开始了。
迁移分三个步骤进行:
- 1) 首先,Core Data将所有对象从一个数据存储复制到下一个数据存储。
- 2) 接下来,Core Data根据关系映射连接并关联所有对象。
- 3) 最后,在目标模型中强制执行任何数据验证。Core Data在数据复制期间禁用目标模型验证。
您可能会问,“如果出现问题,原始源数据存储会发生什么?”对于几乎所有类型的Core Data迁移,除非迁移完成且没有错误,否则原始存储不会发生任何变化。只有在迁移成功时,Core Data才会删除原始数据存储。
您可能会问,“如果出现问题,原始源数据存储会发生什么?”对于几乎所有类型的Core Data迁移,除非迁移完成且没有错误,否则原始存储不会发生任何变化。 只有在迁移成功时,Core Data才会删除原始数据存储。
Types of Migrations - 迁移类型
根据我自己的经验,我发现除了Apple称之为轻量级和重量级迁移之间的简单区别之外,还有一些迁移变体。 下面,我提供了更微妙的迁移名称变体,但这些名称无论如何都不是官方类别。 您将从最不复杂的迁移形式开始,以最复杂的形式结束。
1. Lightweight Migrations - 轻量级迁移
轻量级迁移是Apple的迁移术语,只需要您完成最少量的工作。 当您使用NSPersistentContainer
时,这会自动发生,或者您在构建自己的Core Data堆栈时必须设置一些标志。 您可以更改数据模型的数量有一些限制,但由于启用此选项所需的工作量很少,因此它是理想的设置。
2. Manual Migrations - 手动迁移
手动迁移需要您做更多的工作。 您需要指定如何将旧数据集映射到新集合,但有一个好处就是您可以获得要配置的更明确的映射模型文件。 在Xcode中设置映射模型就像设置数据模型一样,具有类似的GUI工具和一些自动化。
3. Custom Manual Migrations - 自定义手动迁移
这是迁移复杂性指数的第3级。 您仍将使用映射模型,但使用自定义代码补充该模型以指定数据上的自定义转换逻辑。 自定义实体转换逻辑涉及创建NSEntityMigrationPolicy
子类并在那里执行自定义转换。
4. Fully Manual Migrations - 完全手动迁移
完全手动迁移适用于那些甚至指定自定义转换逻辑不足以将数据从一个模型版本完全迁移到另一个模型版本的情况。 自定义版本检测逻辑和迁移过程的自定义处理是必要的。 在本文中,您将设置完全手动迁移以跨非顺序版本更新数据,例如从版本1跳转到4。
在本文中,您将了解每种迁移类型以及何时使用它们。 让我们开始吧!
开始
下载本文资源包含一个名为UnCloudNotes
的入门项目。 找到启动项目并在Xcode中打开它。
在iPhone模拟器中构建并运行应用程序。 你会看到一个空的笔记列表:
点按右上角的加号(+)按钮添加新笔记。 添加标题(注释正文中有默认文本以使处理更快),然后点击Create
将新笔记保存到数据存储。 重复几次,以便迁移一些示例数据。
回到Xcode,打开UnCloudNotesDatamodel.xcdatamodeld
文件,在Xcode中显示实体建模工具。 数据模型很简单 - 只有一个实体,一个Note
,有一些属性。
您将为应用添加新功能:将照片附加到note
的功能。 数据模型没有任何地方可以保留此类信息,因此您需要在数据模型中添加一个位置来保留照片。 但是你已经在应用程序中添加了一些测试notes。 如何在不破坏现有notes的情况下更改模型?
是你第一次迁移的时候了!
A Lightweight Migration - 轻量级迁移
在Xcode中,选择UnCloudNotes
数据模型文件(如果尚未选择)。 这将显示主工作区中的实体建模器。 接下来,打开Editor
菜单并选择Add Model Version ....
将新版本命名为UnCloudNotesDataModel v2
,并确保在Based on model
字段中选择了UnCloudNotesDataModel
。 Xcode现在将创建数据模型的副本。
注意:您可以为此文件指定任何名称。 顺序v2,v3,v4等命名可以帮助您轻松区分版本。
此步骤将创建数据模型的第二个版本,但您仍需要告诉Xcode将新版本用作当前模型。 如果您忘记了此步骤,则选择顶级UnCloudNotesDataModel.xcdatamodeld
文件将执行您对原始模型文件所做的任何更改。 您可以通过选择单个模型版本来覆盖此行为,但确保您不会意外地修改原始文件仍然是一个好主意。
要执行任何迁移,您希望保持原始模型文件不变,并对全新的模型文件进行更改。
在右侧的File Inspector
窗格中,底部有一个名为Model Version
的选择菜单。
更改该选择以匹配新数据模型的名称UnCloudNotesDataModel v2
。
完成更改后,请注意项目导航器中的小绿色复选标记图标已从先前的数据模型移至v2数据模型:
在设置堆栈时,Core Data将尝试首先将持久存储与已勾选的模型版本连接。 如果找到存储文件,并且该文件与此模型文件不兼容,则会触发迁移。 旧版本可用于支持迁移。 当前模型是在连接堆栈的其余部分供您使用之前确保加载的Core Data。
确保选择了v2数据模型,并将image
属性添加到Note
实体。 将属性的名称设置为image
,将属性的类型设置为Transformable
。
由于此属性将包含图像的实际二进制位,因此您将使用自定义NSValueTransformer
将二进制位转换为UIImage
,然后再返回。 只是在ImageTransformer
中为您提供了这样的变换器。 在屏幕右侧的Data Model Inspector
中,查找Value Transformer
字段,然后输入ImageTransformer
。 接下来,在Module
字段中,选择Current Product Module
。
注意:引用模型文件中的代码时,就像在Xib和Storyboard文件中一样,您需要指定一个
module
(UnCloudNotes
或Current Product Module
,具体取决于您的下拉提供的内容),以允许类加载器查找你想要添加的确切的代码。
新模型现在已经准备好了一些代码! 打开Note.swift
并在displayIndex
下面添加以下属性:
@NSManaged var image: UIImage?
构建并运行应用程序。 你会看到你的notes
仍然神奇地显示出来! 事实证明,默认情况下启用轻量级迁移。 这意味着每次创建新的数据模型版本时,它都可以自动迁移,这很省时间!
后记
本篇主要讲述了Core Data的轻量级迁移,感兴趣的给个赞或者关注~~~