CoreData 轻量级迁移
CoreData 轻量级迁移
Core Data 的轻量级迁移可以处理对数据模型进行的简单更改,例如将新属性添加到现有实体中,轻量级迁移基本上与普通迁移相同,区别就是不需要映射模型,因为Core Data可以从数据模型推断映射.
在轻量级迁移过程中,Core Data再NSBundle allBundles 结果返回的捆绑包中查找模型.出于这个原因,常见的做法是将数据模型存储再应用捆绑包中.
通过生成推断的映射模型执行轻量级迁移,模型更改必须满足以下条件:
1. 将新属性添加到现在实体中
2. 从实体中删除属性
3. 将属性从可选更改为非可选,反之亦然
4. 重命名实体
5. 重命名特性
6. 添加新关系
7. 删除现有关系
8. 重命名关系
重命名实体,关系或属性时,需要使用属性检测器将目标模型中指定的新名称设置为对应对象再源模型中的名称.
// CoreData 轻量级迁移
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
} _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"CoreData_LightweightMigration.sqlite"];
NSError *error = nil;
NSString *failureReason = @"There was an error creating or loading the application's saved data."; /*! 主要添加的代码块*/
// NSMigratePersistentStoresAutomaticallyOption
// NSInferMappingModelAutomaticallyOption
// 设置为YES
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],NSMigratePersistentStoresAutomaticallyOption,[NSNumber numberWithBool:YES],NSInferMappingModelAutomaticallyOption, nil]; if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) { NSMutableDictionary *dict = [NSMutableDictionary dictionary];
dict[NSLocalizedDescriptionKey] = @"Failed to initialize the application's saved data";
dict[NSLocalizedFailureReasonErrorKey] = failureReason;
dict[NSUnderlyingErrorKey] = error;
error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code: userInfo:dict]; NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return _persistentStoreCoordinator;
} // 去实现自动迁移,在运行时 Core Data必须能够发现它自己源和目的管理对象模型.如果你需要取把你的模型到本地,不通过自动检查发现,然后你需要去生成推测模型和初始化这个迁移你自己使用一个迁移管理(NSMigrationManager 实例) // 下面的简单代码简单的说明了怎么生成一个推测模型和使用迁移管理初始化一个迁移,这个代码假设你已经实现了两个方法 sourceModel和destinationModel , 分别的返回数据源和目的管理对象模型.
- (BOOL)migrateStore:(NSURL *)storeURL toVersionTwoStore:(NSURL *)dstStoreURL error:(NSError **)outError { // 1.创建原模型
NSManagedObjectModel * sourceModel = [NSManagedObjectModel mergedModelFromBundles:nil]; // 2.创建目的模型
NSManagedObjectModel * destinationModel = [NSManagedObjectModel mergedModelFromBundles:nil]; // Try to get an inferred mapping model.
// 3.尝试获得一个自动推测模型
NSMappingModel *mappingModel = [NSMappingModel inferredMappingModelForSourceModel:sourceModel destinationModel:destinationModel error:outError]; // If Core Data cannot create an inferred mapping model, return NO.
// 4.如果推测模型为空则返回NO
if (!mappingModel) {
return NO;
} // Create a migration manager to perform the migration.
// 5.创建一个推测管理实现迁移
NSMigrationManager *manager = [[NSMigrationManager alloc] initWithSourceModel:sourceModel destinationModel:destinationModel]; // 6. 管理迁移库从从储存URL到目的URL
BOOL success = [manager migrateStoreFromURL:storeURL type:NSSQLiteStoreType
options:nil withMappingModel:mappingModel toDestinationURL:dstStoreURL
destinationType:NSSQLiteStoreType destinationOptions:nil error:outError]; return success;
}
CoreData 轻量级迁移的更多相关文章
- CoreData数据库迁移的操作
CoreData数据库迁移操作步骤,操作是基于Xcode7. 1.添加新的数据库.选中当前数据库版本:Editor->Add Model Verson,创建一个新的数据库版本. 2.Comman ...
- CoreData的简单使用(二)数据的增删改查,轻量级的版本迁移
上一篇中我们已经使用CoreData创建了一个SQLite数据库 CoreData的简单使用(一)数据库的创建 现在对数据库进行数据的CRUD(增删改查) 1.Data Model 的设置 创建一个D ...
- CoreData的数据迁移
CoreData的数据迁移 很多人说CoreData坑多,现在才感觉到,今天上午写代码的时候,发现了一个大问题. 过程如下,之前我自己给coredata的实体添加了几个字段,后来网上的一个用户说我 ...
- iOS CoreData (二) 版本升级和数据库迁移
前言:最近ChinaDaily项目需要迭代一个新版本,在这个版本中CoreData数据库模型上有新增表.实体字段的增加,那么在用户覆盖安装程序时就必须要进行CoreData数据库的版本升级和旧数据迁移 ...
- 3.3. 轻量级的迁移方式(Core Data 应用程序实践指南)
持久化存储协调器会试着用新版的模板打开原来的持久化存储区,但是那是旧的模板,旧的格式,当然会出错.现在要做的就是迁移现有的持久化数据区,以便跟新模型匹配. 怎么进行迁移呢? 在什么时候进行迁移? 在向 ...
- CoreData 数据模型的版本控制
CoreData 数据模型的版本控制 在项目中选择数据模型,然后选择Editor | Add Model Version 通过属性栏的ModelVersion current 选项进行版本的选择控制. ...
- coreData详解
1.初识CoreData CoreData的结构构成: NSManagedObjectModel的构成: 可以通过Entity创建继承自NSManagedObject类的文件,这个文件就是开发中使用的 ...
- 自定义 Core Data 迁移
本文转载至 http://objccn.io/issue-4-7/ 感谢本文作者 朱宏旭 的不啬分享 自定义 Core Data 迁移似乎是一个不太起眼的话题.苹果在这方面只提供了很少的文档,若是初次 ...
- Core Data 迁移与版本管理
原文 http://chun.tips/blog/2014/11/28/core-data-ban-ben-qian-yi-jing-yan-zong-jie/ 主题 Core DataiOS开发 ...
随机推荐
- 然当装入Ubuntu双系统时,会出现无线硬件开关关闭的问题,当然也就无法连网
rfkill list all 会出现如下提示 0:ideapad_wlan: Wireless LAN Soft blocked: no Hard blocked:yes ...
- 【整理】深入理解拉格朗日乘子法(Lagrange Multiplier) 和KKT条件
在求解最优化问题中,拉格朗日乘子法(Lagrange Multiplier)和KKT(Karush Kuhn Tucker)条件是两种最常用的方法.在有等式约束时使用拉格朗日乘子法,在有不等约束时使用 ...
- 安卓ndk参考资料
http://developer.samsung.com/technical-doc/view.do;jsessionid=xKa-L5xQDvdrSyc1sN71lHAXjcv2YUH7I92zjH ...
- java基础总结——基础语法1
一.标示符 二.关键字 三.java基本数据类型 3.1 常量 ● 常量表示不能改变的数值. ● java中常量的分类: 1. 整数常量.所有整数 2. 小数常量.所有小时 3. 布尔型常量.较为特有 ...
- ES6 基础知识
let:用来定义变量特点:只能在代码块里面使用,let拥有块级作用域;并且let不允许重复声明; 比如: var a = 12; var a = 5; alert(a); //5; let a = 1 ...
- CSS使用position定位后导致元素浮动
1.子元素 absolute/fixed定位后,子元素脱离文档流存在,它让出原来占的那个坑,父元素再也不能通过子元素来撑开高度了 <style> div{ position:absolut ...
- 常用git命令纪录
git branch xxx 新建分支xxx git branch -a 查看所有分支(包括远程) git remote add origin http://xxx.git 在本地添加一个远程仓库, ...
- HTML5零基础学习Web前端需要知道哪些?
HTML零基础学习Web前端网页制作,首先是要掌握一些常用标签的使用和他们的各个属性,常用的标签我总结了一下有以下这些: html:页面的根元素. head:页面的头部标签,是所有头部元素的容器. b ...
- iOS导航栏的正确隐藏方式【转】
简介:在项目中经常碰到首页顶部是无限轮播,需要靠最上面显示.有的设置导航栏为透明等一系列的方法,这个可以借助第三方.或者干脆简单粗暴的直接隐藏掉导航栏.可是push到下一个页面的时候是需要导航栏的,如 ...
- Nginx+uwsgi安装配置
一.安装基础开发包 yum groupinstall "Development tools" yum install zlib-devel bzip2-devel pcre-dev ...