iOS CoreData (二) 版本升级和数据库迁移

作者: 且行且珍惜_iOS | 来源:发表于2018-03-07 16:31 被阅读767次

    前言:最近ChinaDaily项目需要迭代一个新版本,在这个版本中CoreData数据库模型上有新增表、实体字段的增加,那么在用户覆盖安装程序时就必须要进行CoreData数据库的版本升级和旧数据迁移,如果仅仅是在旧版本的数据模型上进行上述操作,就会造成所有旧用户更新完成后的第一次启动崩溃。

    • 数据迁移的方式有好几种,这里就先介绍我用的轻量级的数据迁移方式:Core Data轻量级迁移是适用于添加新表,添加新的实体,添加新的实体属性,等简单的,系统能自己推断出来的迁移方式。
      接下来在我之前写的 iOS CoreData (一) 增删改查 示例基础上进行演示:
    1、新建一个版本的数据库模型Model2:
    • 选中Model.xcdatamodeld文件,选择菜单editor->Add Model Version 取名为:Model2.xcdatamodel,然后就可以发现Model.xcdatamodeld目录下有两个版本的数据库模型


      add model version.gif
    2、设置当前coreData的数据模型为Model2:
    • 选中Model.xcdatamodel或Model2.xcdatamodel,在左侧的Model Version 中选择Current模版为Model2


      设置当前数据库版本.gif
    3、修改新数据模型Model2,在Model2上添加字段及表:
    • 从第2步 演示图中可以看到旧Model中的表和实体属性都自动迁移到了Model2中,新的表和实体属性我们可以直接在Model2上操作创建,但是别忘了删除原来的类文件,重新生成下新的实体类:


      修改新数据模型Model2.gif
    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

    CoreData调试.png

    之前相关文章:iOS CoreData (一) 增删改查

    赞赞.gif

    相关文章

      网友评论

      • c597dd01fa1f:楼猪,demo仍出来呀,放github上也行
        且行且珍惜_iOS:https://github.com/wslcmk/CoreDataLearn.git
      • 张囧瑞:哈喽,请问下您有没有做过coredata+ iCloud的同步??
        张囧瑞:@且行且珍惜_iOS 好吧,谢谢啦
        且行且珍惜_iOS:@张囧瑞 icloud同步?这个还真没做过
      • 悠闲的拖鞋:请问,在第一个类创建了数据库,第二个类调用怎么操作
        且行且珍惜_iOS:@悠闲的拖鞋 不是,你先判断本地有没有此数据库,有的话,就不创建了,直接用就行了
        悠闲的拖鞋:@且行且珍惜_iOS 我的意思是每次进去都要创建新的数据库都要运行一次吗?如果我有两个页面用到同一个数据库,那是不是创建数据库那个方法要写两次吗?
        且行且珍惜_iOS:我不太明白你的意思
      • Young_Blood:请问下,第四步是如何操作的?在哪里写的方法?谢谢
        Young_Blood:@且行且珍惜_iOS 好的,已经成功完成迁移了。谢谢你
        且行且珍惜_iOS:你看一下我的前一篇 https://www.jianshu.com/p/332cba029b95 ,是在初始化创建数据库的时候

      本文标题:iOS CoreData (二) 版本升级和数据库迁移

      本文链接:https://www.haomeiwen.com/subject/puodfftx.html