3.3. 轻量级的迁移方式(Core Data 应用程序实践指南)
持久化存储协调器会试着用新版的模板打开原来的持久化存储区,但是那是旧的模板,旧的格式,当然会出错。现在要做的就是迁移现有的持久化数据区,以便跟新模型匹配。
怎么进行迁移呢?
在什么时候进行迁移?
在向NSPersistentStoreCoordinator添加存储区的时候。
那么如何添加呢?
答案是,将下列选项放到NSDictionary里传过去,就会自动完成存储区的迁移工作。
- 如果传给NSPersistentStoreCoordinator的NSMigratePersistentStoresAutomaticallyOption是YES,那么Core Data就会试着把低版本持久化存储区迁移到最新版本的模型
- 如果传给NSPersistentStoreCoordinator的NSInferMappingModelAutomaticallyOption是YES,那么Core Data 会试着以最合理的方式自动推断出 “源模型实体” 中某个属性对应 “目标模型实体” 中的哪一个属性
- 假如在开发Core Data程序的时候海使用了iCloud,那么只能采用这种迁移方式
- 把上面的两个选项打开后,就是 轻量级迁移(lightweight migration)
修改CoreDataHelperd的 loadStore方法如下:
NSDictionary *options = @{
NSMigratePersistentStoresAutomaticallyOption:@YES,
NSInferMappingModelAutomaticallyOption:@YES,
NSSQLitePragmasOption:@{@"journal_mode":@"DELETE"}
};
NSError *error = nil;
_store = [_coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[self storeURL] options:options error:&error];
下面我要为新的实体创建50000条数据。
不知道作者为什么要搞这么多条,用了大概2分钟才执行完,由于作者每次都修改demo ,会删除原来的数据,难道就不能用demo1,demo2吗?
- (void)demo2 {
if (debug == ) {
NSLog(@"Running %@ '%@'",self.class, NSStringFromSelector(_cmd));
}
for (int i=; i<; i++) {
Measurement *newMeasurement = [NSEntityDescription insertNewObjectForEntityForName:@"Measurement" inManagedObjectContext:_coreDataHelper.context];
newMeasurement.abc = [NSString stringWithFormat:@"-->> LOTS OF TEST DATA x%i",i];
NSLog(@"Insert %@",newMeasurement.abc);
}
[_coreDataHelper saveContext];
}
然后打印出来
- (void)demo3 {
if (debug == ) {
NSLog(@"Running %@ '%@'",self.class, NSStringFromSelector(_cmd));
}
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Measurement"];
[request setFetchLimit:];
NSError *error = nil;
NSArray *fetchedobjects = [_coreDataHelper.context executeFetchRequest:request error:&error];
if (error) {
NSLog(@"%@",error);
}else{
for (Measurement *measurement in fetchedobjects) {
NSLog(@"Fetched Object = %@", measurement.abc);
}
}
}
注:migrate 是 “迁移”,Infer 是 “推断”,pragmas 是 “语法”。
3.3. 轻量级的迁移方式(Core Data 应用程序实践指南)的更多相关文章
- 3. 托管对象模型的迁移(Core Data 应用程序实践指南)
本章介绍如何添加模型版本及模型映射,演示几种迁移技术,供在升级模型时使用. 3.1. 修改托管对象模型 3.2. 添加模型版本 3.3. 轻量级迁移方式 3.4. 默认的迁移方式 3.5. 通过迁移管 ...
- Core Data 应用程序实践指南(Core Data 应用程序实践指南)
译者序 前言 勘误 1. 初次尝试Core Data应用程序 本书的基础,基本概念,能做什么,不能做什么.实现CoreDataHelper类,演示如何将Core Data同既有的应用程序相集成. 2. ...
- 1.1.Core Data是什么(Core Data 应用程序实践指南)
Core Data是个框架,把数据当作对象来操作. 由Core Data提供的数据对象叫托管对象(managed objecgt),而Core Data 位于程序和持久化存储区之间. 托管对象模型里有 ...
- 3.2. 添加模板版本(Core Data 应用程序实践指南)
为了不像3.1那样崩溃,修改模型之前先创建新的模型版本.添加之后,会生成一个新的xcdatamodel文件,并且跟原来的内容完全一样,这有意思了,但是不要删除原来旧版的模型.旧的模型有助于把原来持久化 ...
- 2.7. 属性的各种设置选项(Core Data 应用程序实践指南)
可供配置的选项根据属性类型的不同有所变化,并不是每一种属性都能配置下列选项 Transient:勾选该选项,表示该属性不写入“持久化存储区”,这听起来很奇怪,但有时候,只需要把特性留在托管对象上下文就 ...
- 1.4. 为现有的应用程序添加 Core Data 支持(Core Data 应用程序实践指南)
项目创建时会有 “Use Core Data" ,但是,有时没有勾选这个选项,那么就要手动链接Core Data Framework. 选中 Grocery Dude Target Gene ...
- 1.2.Core Data 的适用场合(Core Data 应用程序实践指南)
如果应用程序要保存的设置数据太多,以致NSUserDefaults及“属性列表“(property list)这种简单的存储方案无法应付.不需要再"重新发明轮子"(reinvent ...
- 1.1.1.持久化存储协调器(Core Data 应用程序实践指南)
持久化存储协调器(persistent store coordinator)里面包含一份持久化存储区,而存储区里又含有数据表里的若干行数据. 与原子存储不同,SQLite数据库会在用户提交变更日志时进 ...
- 2.1. 托管对象模型是什么(Core Data 应用程序实践指南)
托管对象模型是一种数据结构.在这里,数据结构.纲要.对象图.数据模型.托管对象模型这些术语是一个意思.它们是对同一个东西不同场景的描述.比如,对Core Data 而言是托管对象模型,对设计器来说是对 ...
随机推荐
- html常见标签使用
<body> <!--标题标签--> <h1></h1> <h2></h2> <h3></h3> < ...
- Android ART运行时无缝替换Dalvik虚拟机的过程分析
Android ART运行时无缝替换Dalvik虚拟机的过程分析 分类: Android2014-01-13 00:59 42722人阅读 评论(66) 收藏 举报 AndroidARTDalvikV ...
- Java基于Socket文件传输示例
http://www.blogjava.net/sterning/archive/2007/10/13/152508.html 最近需要进行网络传输大文件,于是对基于socket的文件传输作了一个初步 ...
- Navicate for mysql 数据库设计-数据库分析
在使用Navicate for mysql进行数据库设计时,如果要分析已有db的表结构,则可以将已经分析过的表放入一个新建的组中,把精力更加集中在剩下的表中,以免受到干扰.
- JAVA基础-- 对象转型 (casting)
1. 一个基类的引用类型变量可以指向其子类的对象: a=new Dog("bigyellow","yellow"); 2. 一个基类的引用不可以访问其子类对象新 ...
- Android音频系统之AudioFlinger(一)
1.1 AudioFlinger 在上面的框架图中,我们可以看到AudioFlinger(下面简称AF)是整个音频系统的核心与难点.作为Android系统中的音频中枢,它同时也是一个系统服务,启到承上 ...
- Wiegand协议(转)
源:http://blog.chinaunix.net/uid-22670933-id-3268318.html Wiegand26协议是由美国工业安全委员会SIA(Security Industry ...
- IFieldEdit Interface 接口
Description The IFieldEdit interface is used when creating new fields. You should not use it to modi ...
- k-means算法的Python实现
#coding=utf-8 import codecs import numpy from numpy import * import pylab def loadDataSet(fileName): ...
- jQuery中的attr()和prop()使用
总结:除了checked.seleted这样的属性推荐用prop()外,其他的随意都可以. 原因如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML ...