CoreData 版本迁移
轻量级迁移
如果你仅仅对你的模型做简单的改变(例如向一个实体里增加一个新的属性),CoreData可以执行自动的数据迁移,即所谓的轻量级迁移。轻量级的迁移功能上和普通的迁移相同,除了你不用提供一个映射模型,CoreData可以根据原管理对象模型和目的管理对象模型的不同推断出一个映射模型。
轻量级迁移在早期的开发过程中,比如当你可能会频繁改变你的管理对象模型,但是你又不想必须去保存再生的测试数据的时候是相当方便的。你可以迁移已存在的数据而不需要必须为每一个模型版本创建一个自定义的映射模型。
一个比你不用自己创建映射模型更大的好处来使用轻量级迁移就是:如果i使用一个推断的模型,而且你使用SQLite存储,那么CoreData可以用SQL语句进行迁移。这是一个很大的性能优化,因为CoreData不用加载你的数据。
CoreData 必须能够推断映射模型
为了执行自动的轻量级迁移,CoreData需要在运行期自己找到源和目地管理对象模型。CoreData会在bundle中寻找模型。coredata必须能够分析出持久化实体和属性的语法改变并且产生一个推断的映射模型。
在以下情况下,coredata可以产生一个推断的映射模型:
1.简单的增加一个新属性
2.移除一个属性
3.一个非可选的属性变成可选的。
4.一个可选属性变成不可选的,并且定义一个默认值。
5.重命名一个实体或者属性。
如果你重命名一个实体或者属性,你可以设置目地模型中的重命名标识符到源模型相应实体或者属性的名字。你可以在xcode中的数据模型工具的属性检查器中设置。
重命名标识符创建一个规范的名字,所以你应该设置重命名标识符到源模型的属性名上。这意味着你可以在一个模型的版本2中重命名属性,然后在版本3中又可以重命名。这个重命名将会在版本2到3或者版本1到3中正常工作。
另外轻量级迁移同样支持以下情况:
1.添加关系和改变关系类型
(1)你可以增加一个新的关系或者可以删除一个已存在的关系。
(2)重命名一个关系。(使用重命名标识符)
(3)改变一个关系,从一对一到一对多。或者一个无序的一对多到一个有序的。
2.改变实体层级
(1)你可以增加,移除,重命名实体。
(2)你可以创建一个新的父实体或者子实体并且在实体层级上下移动属性。
(3)你可以从一个层级中移除实体。(但是你不能合并实体层级,如果已经存在的实体在源模型中不能分享一个父实体,那么在目地模型中也不可以)。
迁移步骤:
1.选中工程中的xcdaramodeld文件,在工具栏的Editor选择Add Model Version。(这一步完成之后会出现新增加的model文件)
2.在xcode右侧的辅助工具栏中找到Model Version,选择新添加的Model文件,此时Model文件上的绿色的勾选中了当前选择的Model文件。
3.在新的Model文件中修改最新的Entity信息,同时修改NSManagedObject子类对应的实现。
4.修改NSPersistentStoreCoordinator部分实现。通过设置options字典里NSMigratePersistentStoreAutomaticallyOption和NSInferMappingModelAutomaticallyOption对应的键值为YES,并且将这个options字典传递给addPersistentStoreWithType:configuration:URL:options:error:方法,就可以请求自动轻量级迁移。
NSError *error = nil;
NSURL *storeURL = <#The URL of a persistent store#>;
NSPersistentStoreCoordinator *psc = <#The coordinator#>;
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
BOOL success = [psc addPersistentStoreWithType:<#Store type#>
configuration:<#Configuration or nil#> URL:storeURL
options:options error:&error];
if (!success) {
// Handle the error.
}