我的这篇文章里提到了,关于Core Data的数据迁移过程有两个维度可以自定制:
- 在迁移的过程中可以执行自定制的代码。通常是通过提供自己的migration policy类来实现。
- 可以自定制版本检测和迁移过程。指的是自己建立migration manager,判断是否需要迁移,以及控制迁移过程。
custom迁移过程则是从这两个维度进行了自定制。相对于定义从所有的历史版本到当前版本的mapping model, 更为合理的方式是渐进式迁移,即只定义从上一版本到当前版本的mapping model,渐进式地完成迁移过程。 这种方式的总体思路是:
- 创建每个版本迁移到下一个版本的mapping model, 创建可能的NSEntityMigrationPolicy,
- 创建并操作NSMigrationManager完成每一个版本的迁移
大致的流程图为:
迁移过程中有几个关键角色:
- NSMappingModel:提供了接口用于从指定的bundle中查找从source model到destination model迁移所需的.cdm文件,并根据文件创建mapping model
- MSMappingManager: 根据指定的source model、target model、mapping model, 对数据库文件执行迁移动作。具体的迁移过程是NSMigrationManager根据NSEntityMapping, 针对source instance创建对应的destination instance(s)
- NSEntityMapping: how to map an entity from a source to a destination managed object model;可以为每一个NSEntityMapping指定它所使用的NSEntityMigrationPolicy。在xcode中可以创建和编辑
- NSEntityMigrationPolicy: 其实例为一个具体实体映射的迁移策略。简单的说,这个类让我们不仅仅能修改实体的属性和关系,而且还能任意添加一些自定义的操作来完成每个实体的迁移