Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >iOS CoreData (二) 版本升级和数据库迁移

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

作者头像
且行且珍惜_iOS
发布于 2018-05-22 09:30:39
发布于 2018-05-22 09:30:39
1.5K00
代码可运行
举报
运行总次数:0
代码可运行

前言:最近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字典
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 //创建持久化存储助理:数据库
 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 (一) 增删改查

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.03.07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
iOS CoreData (二) 版本升级和数据库迁移
NSMigratePersistentStoresAutomaticallyOption = YES,那么Core Data会试着把之前低版本的出现不兼容的持久化存储区迁移到新的模型中,这里的例子里,Core Data就能识别出是新表,就会新建出新表的存储区来。
且行且珍惜_iOS
2018/05/22
1.5K0
iOS Core Data 数据迁移 指南 - 简书
Core Data是iOS上一个效率比较高的数据库框架,(但是Core Data并不是一种数据库,它底层还是利用Sqlite3来存储数据的),它可以把数据当成对象来操作,而且开发者并不需要在乎数据在磁盘上面的存储方式。它会把位于NSManagedObject Context里面的托管对象NSManagedObject类的实例或者某个NSManagedObject子类的实例,通过NSManagedObjectModel托管对象模型,把托管对象保存到持久化存储协调器NSPersistentStoreCoordinator持有的一个或者多个持久化存储区中NSPersistentStore中。使用Core Data进行查询的语句都是经过Apple特别优化过的,所以都是效率很高的查询。
一缕殇流化隐半边冰霜
2024/02/14
4540
iOS Core Data 数据迁移 指南 - 简书
「死磕」Core Data——入门
因为我是文科狗转行的程序猿,并没有学过数据库相关课程,也欣赏不出SQLite的美,所以之前的项目一直用NSKeyedArchiver和NSKeyedUnarchiver(固化)进行数据的本地保存(所幸我接触的项目,数据都不会太复杂)。
iOS Development
2019/02/14
1.2K0
储存篇 - CoreData使用大全
Core Data框架提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite3数据库文件中,也能够将保存在数据库中的数据还原成OC对象。在此数据操作期间,不需要编写任何SQL语句。使用此功能,要添加CoreData.framework和导入主头文件 <CoreData/CoreData.h>。
進无尽
2019/01/02
2.7K0
iOS中CoreData数据管理系列二——CoreData框架中三个重要的类
    在上一篇博客中,介绍了iOS中使用CoreData框架设计数据模型的相关步骤。CoreData框架中通过相关的类将数据——数据模型——开发者无缝的衔接起来。NSManagedObjectModel对应数据模型,即上篇博客中我们创建的.xcdatamodeld文件;NSPersistentStoreCoordinator相当于数据库与数据模型之间的桥接器,通过NSPersistentStoreCoordinator将数据模型存入数据库;NSManagedObjectContext是核心的数据管理类,开发者通过操作它来执行对数据的相关操作。
珲少
2018/08/15
7110
【IOS开发高级系列】CoreData专题
        Managed Object Model 是描述应用程序的数据模型,这个模型包含实体(Entity),特性(Property),读取请求(Fetch Request)等。(下文都使用英文术语。)
江中散人_Jun
2023/10/16
7990
【IOS开发高级系列】CoreData专题
iOS CoreData (一) 增删改查
选择Arguments,在下面的ArgumentsPassed On Launch中添加下面两个选项,如图:
且行且珍惜_iOS
2018/05/22
1.3K0
iOS中CoreData数据管理系列三——添加与查询数据
    在前两篇博客中,分别介绍了iOS中CoreData框架创建数据模型和CoreData框架中的三个核心类。博客地址如下:
珲少
2018/08/15
9080
iOS中CoreData数据管理系列三——添加与查询数据
MagicalRecord,一个简化CoreData操作的工具库
本文介绍了如何在iOS中使用MagicalRecord来简化Core Data的使用,包括使用MagicalRecord的API直接对对象进行操作、使用MagicalRecord的Record/Fetch计划对对象进行操作、以及使用MagicalRecord的Record/Fetch计划对对象进行异步操作。同时,本文还介绍了如何使用MagicalRecord的Record/Fetch计划对对象进行批量操作,以及使用MagicalRecord的Record/Fetch计划对对象进行分组操作。最后,本文还介绍了如何使用MagicalRecord的Record/Fetch计划对对象进行事务操作,以及使用MagicalRecord的Record/Fetch计划对对象进行缓存操作。
ios122
2018/01/02
1.6K0
MagicalRecord,一个简化CoreData操作的工具库
iOS开发之表视图爱上CoreData
  在接触到CoreData时,感觉就是苹果封装的一个ORM。CoreData负责在Model的实体和sqllite建立关联,数据模型的实体类就相当于Java中的JavaBean, 而CoreData的功能和JavaEE中的Hibernate的功能类似,最基本是两者都有通过对实体的操作来实现对数据库的CURD操作。CoreData中的上下文(managedObjectContext)就相当于Hibernate中的session对象, CoreData中的save操作就和Hibernate中的commit,还
lizelu
2018/01/11
2.3K0
iOS开发之表视图爱上CoreData
CoreData 探秘 - 从数据模型构建到托管对象实例
对每一个使用 Core Data 的开发者来说,用 Xcode 的 Core Data 模型编辑器构建数据模型、创建容器、加载数据模型并通过托管对象上下文最终创建托管对象实例,这都是十分普通的过程。但你是否好奇过这一切的内部运行机制,Core Data 是如何在幕后辅助我们完成这一切的?本文将深入探究 Core Data 是如何通过数据模型构建出托管对象实例的内部运行机制,读完本文可以让你对 Core Data 的工作流程有更深入的理解,在开发中可以更得心应手。
东坡肘子
2023/09/19
3110
CoreData 探秘 - 从数据模型构建到托管对象实例
Swift实践:使用CoreData完成一个通讯录存储
CoreData作为Apple的亲儿子,依然在App需要存储结构化数据上发挥着重要的作用。CoreData已经超过十年了,而且亲爹还在积极的维护着它。 image.png 在Monster、Indee
stanbai
2018/06/28
1.8K0
CoreData简介以及第三方框架MagicRecord源码解析
数据库对象,一个NSManagedObject对应一张表,NSManagedObject的一个属性对应数据表的一个字段。数据库的增删查改就是操作NSManagedObject,通过xCode->Editor->Create NSManagedObject Subclass…来创建对应表的对象model
Helloted
2022/06/07
7720
CoreData简介以及第三方框架MagicRecord源码解析
Swift实践:使用CoreData完成上班签到小工具1. CoreData Stack的作用2.创建 CoreData Stack3. 一对多的关系4. 完成Demo,了解使用CoreData St
image.png 之前在前两篇里面实现了一个十分简陋的通讯录,而且都是通过系统默认的方式创建的CoreData。可是实际中哪里有那么好的事情嘛,要是忘记在创建工程的时候勾选了下面这个图怎么办? image.png 难道我们要把工程删除,再重新创建嘛?很多时候再开始工程的时候并特么的不知道需要用到数据库啊。更多的时候已经都开始敲代码了,连需求文档都还木有拿到手里,PM只会轻轻的说一句:设计图不是已经有了嘛,先画UI吧。 所以,CoreData Stack是为了解决这个问题诞生的嘛?很遗憾,并不是。看了前面的
stanbai
2018/06/28
1.5K0
iOS面试题梳理(二)
继续..... 循环引用的产生原因,以及解决方法 1.产生原因:如下图所示,对象A和对象B相互引用了对方作为自己的成员变量,只有自己销毁的时候才能将成员变量的引用计数减1。对象A的销毁依赖于对象B的销毁,同时对象B销毁也依赖与对象A的销毁,从而形成循环引用,此时,即使外界没有任何指针访问它,它也无法释放。 2.多个对象间依然会存在循环引用问题,形成一个环,在编程中,形成的环越大越不容易察觉,如下图所示: 解决方法: 1,事先知道存在循环引用的地方,在合理的位置主动断开一个引用,是对象回收; 2.使用弱
Jacklin
2018/05/15
1.2K0
详解持久化Core Data框架的原理以及使用---转自Bison的技术博客
1.原理部分 Care Data是一个纯粹的面向对象框架,可用于管理实体以及实体之间的关联关系的持久化,也就是我们通常所指的数据持久化。 Care Data底层的持久化存储方式可以是SQLite数据库,也可以是XML文档,甚至可以直接以内存作为持久化存储设备。 Care Data的核心概念是实体。实体是由Care Data管理的模型对象,它必须是NSManagedObject类或其子类的实例。实体与实体之间存在1-1、1-N、N-N、的关联关系,整个应用的所有实体以及实体之间的关联关系被称为托管对象模型
Bison
2018/07/04
1.5K0
Core Data /FMDB/SQLite/
Core Data core data 基于model-view-controller(mvc)模式下,为创建分解的cocoa应用程序提供了一个灵活和强大的数据模型框架。 Core Data数据持久化是对SQLite的一个升级,它是ios集成的,在说Core Data之前,我们先说说在CoreData中使用的几个类。 (1)NSManagedObjectModel(被管理的对象模型) 相当于实体,不过它包含 了实体间的关系 (2)NSManagedObjectContext(被管理的对象上下文
且行且珍惜_iOS
2018/05/22
8730
掌握 Core Data Stack
或许觉得比较枯燥,亦或许感觉 Xcode 提供的模版已经满足了使用的需要,很多 Core Data 的使用者并不愿意在 Core Data Stack 的了解和掌握上花费太多的精力。这不仅限制了他们充分使用 Core Data 提供的丰富功能,同时也让开发者在面对异常错误时无所适从。本文将对 Core Data Stack 的功能、组成、配置等做以说明,并结合个人的使用经验聊一下如何设计一个符合当下需求的 Core Data Stack。本文并不会展示一个完整的创建代码,更多是原理、思路和经验的阐述。
东坡肘子
2022/07/28
8910
掌握 Core Data Stack
iOS本地数据存储
数据存储本质就是运行时的对象保存在文件、数据库中。数据存储可以分为两步:首先是将对象转换成二进制数据,这一步也叫序列化;相反,将二进制数据转换成对象则称为反序列化;然后是考虑二进制数据如何保存和读取。
落影
2019/07/15
3K0
iOS本地数据存储
CoreData和FMDB你用哪个?
概括:         我们先说说这两个东西,CoreData 和 FMDB,其实就我自己而言觉得这两个都不错,刚开始是接触FMDB的,CoreData是工作后自己看的。苹果推荐开发者去使用CoreData,但 FMDB 在 git 上的那上万颗星星也说明了开发者对它的喜爱。在开发中你要是只是使用一张表去存储一点简单的东西,使用FMDB也方便,可是一旦表与表之间产生属性关联的话,用FMDB就比较的麻烦了。但用 CoreData 就比较的容易。        再说说今天我们想说的,也是我看其他人的博客学到的
Mr.RisingSun
2018/01/12
1.8K0
CoreData和FMDB你用哪个?
相关推荐
iOS CoreData (二) 版本升级和数据库迁移
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验