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

前言:最近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

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏智能大石头

NewLife.Net——开始网络编程

1393
来自专栏coding

django2实战2.创建博客应用创建应用文章表的字段设计激活应用开启后台将post模型注册到后台自定义文章显示字段增加可选操作

上篇创建了一个项目,项目相当于站点,应用即是独立的功能模块。比如:淘宝是一个完整的网站,即是一个项目。而淘宝下的聚划算属于一个应用

1683
来自专栏飞雪无情的博客

Go语言经典库使用分析(五)| Negroni 中间件(一)

上一篇介绍的Gorilla Handlers中间件,严格来说不能称之为一个库或者框架,他只是一系列包装http.Handler的中间件函数,并且他们之间没有任何...

893
来自专栏LinXunFeng的专栏

iOS - FTPManager的简单使用及常见问题

1744
来自专栏陈满iOS

iOS·采用第三方(百度地图SDK)实现定位等功能开发

首先,申请一个baidu账号,接着进入新建密钥入口申请成为baidu地图开发者,填写相关开发者信息和短信验证码。接下来点击创建应用,如官方文档新建密钥文档指南里...

5853
来自专栏Felix的技术分享

《一个操作系统的实现》笔记(2)--保护模式

3908
来自专栏iOS开发攻城狮的集散地

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

2065
来自专栏ionic3+

ng-zorro-mobile,踩坑记

ionic3和ionic4差别是比较大的,所以ionic3二次封装的组件基本是不能直接用在ionic4上。ng-zorro-mobile并不是依赖ionic的组...

1.1K3
来自专栏智能大石头

NewLife.Net——开始网络编程

网络编程的重要性就不说了,先上源码:https://github.com/nnhy/NewLife.Net.Tests

990
来自专栏张善友的专栏

在 Windows 上安装Rabbit MQ 指南

rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统。他遵循Mozilla Public License开源协议。采用 Erlang 实现...

2239

扫码关注云+社区

领取腾讯云代金券