前言: 最近 ChinaDaily 项目需要迭代一个新版本, 在这个版本中 CoreData 数据库模型上有新增表, 实体字段的增加, 那么在用户覆盖安装程序时就必须要进行 CoreData 数据库的版本升级和旧数据迁移, 如果仅仅是在旧版本的数据模型上进行上述操作, 就会造成所有旧用户更新完成后的第一次启动崩溃. 示例 Demo: https://github.com/wslcmk/CoreDataLearn.git
数据迁移的方式有好几种, 这里就先介绍我用的轻量级的数据迁移方式: Core Data 轻量级迁移是适用于添加新表, 添加新的实体, 添加新的实体属性, 等简单的, 系统能自己推断出来的迁移方式. 接下来在我之前写的 iOS CoreData (一) 增删改查 https://www.jianshu.com/p/332cba029b95 示例基础上进行演示:
1, 新建一个版本的数据库模型 Model2:
选中 Model.xcdatamodeld 文件, 选择菜单 editor->Add Model Version 取名为: Model2.xcdatamodel, 然后就可以发现 Model.xcdatamodeld 目录下有两个版本的数据库模型
2, 设置当前 coreData 的数据模型为 Model2:
选中 Model.xcdatamodel 或 Model2.xcdatamodel, 在左侧的 Model Version 中选择 Current 模版为 Model2
3, 修改新数据模型 Model2, 在 Model2 上添加字段及表:
从第 2 步 演示图中可以看到旧 Model 中的表和实体属性都自动迁移到了 Model2 中, 新的表和实体属性我们可以直接在 Model2 上操作创建, 但是别忘了删除原来的类文件, 重新生成下新的实体类:
4, 设置数据库参数 options, 打开数据库升级迁移的开关.
把方法 - (nullable __kindof NSPersistentStore *)addPersistentStoreWithType:(NSString *)storeType configuration:(nullable NSString *)configuration URL:(nullable NSURL *)storeURL options:(nullable NSDictionary *)options error:(NSError **)error 中的 options 参数置为如下的 options 字典
- // 创建持久化存储助理: 数据库
- NSPersistentStoreCoordinator * store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
- // 请求自动轻量级迁移
- NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
- [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
- [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
- nil];
- NSError *error = nil;
- // 设置数据库相关信息 添加一个持久化存储库并设置存储类型和路径, NSSQLiteStoreType:SQLite 作为存储库
- [store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:sqlUrl options:options error:&error];
这里说一下新增加的 2 个参数的意义: NSMigratePersistentStoresAutomaticallyOption = YES, 那么 Core Data 会试着把之前低版本的出现不兼容的持久化存储区迁移到新的模型中, 这里的例子里, Core Data 就能识别出是新表, 就会新建出新表的存储区来. NSInferMappingModelAutomaticallyOption = YES, 这个参数的意义是 Core Data 会根据自己认为最合理的方式去尝试 MappingModel, 从源模型实体的某个属性, 映射到目标模型实体的某个属性.
5, 编译结束, CoreData 调试:
打开 Product, 选择 Edit Scheme. 选择 Arguments, 在下面的 ArgumentsPassed On Launch 中添加下面两个选项, 如图: (1)-com.apple.CoreData.SQLDebug (2)1
来源: https://juejin.im/post/5c08885e6fb9a049d5194860