启动迁移流程
本章介绍如何启动迁移过程以及默认的迁移过程的工作原理。它没有描述自定义迁移过程。
当你初始化一个持久性储存协调器时,你可以为其分配托管对象模型;协调器使用该模型来打开持久储存。使用addPersistentStoreWithType:configuration:URL:options:error:打开持久储存。但是,如何使用此方法取决与应用程序是使用模型版本控制器还是选择支持的迁移方式,无论你选择使用默认迁移过程还是自定版本偏移检测和迁移引导指令。以下列表描述了不同的场景以及应该在每个场景中执行的操作:
- 你的应用程序不支持版本控制
你可以直接使用 addPersistentStoreWithType:configuration:URL:options:error:方法
如果由于某种原因,协调器的模型与储存的模式不兼容(即,版本哈希当前模型的实体不等于储存的元数据中的实体),协调器检测到此错误,并生成一个错误,并且 addPersistentStoreWithType:configuration:URL:options:error:返回NO。你必须正确处理此错误。 - 你的应用程序支持版本控制,并且你选择了轻量级或默认迁移过程。
使用 addPersistentStoreWithType:configuration:URL:options:error 分别在轻量级迁移和默认迁移过程中所述。
与非版本方法的根本区别在于,你指示协调器通过向密匙 为 NSMigratePersistentStroresAutomaticallyOption的选项字典添加条目,将储存自动迁移到当前模型版本,该值是表示“YES”的NSNumber对象。 - 你的应用程序支持版本控制,并且你选择使用自定义版本偏移检测和迁移引导。
在打开储存之前,使用 isConfiguration:CompatibleWithyStoreMetadata:检测其架构是否与协调器的型号兼容: - 如果是,则使用 addPersistentStoreWithType:configuration:URL:options:error:直接打开储存。
- 如果不是,那么必须首先迁移储存,然后打开它(再次使用addPersistentStoreWithType:configuration:URL:options:error:)。
你可以简单的使用addPersistentStoreWithType:configuration:URL:options:error:检查是否需要迁移,但这是一个重量级的操作,对于此目的来说效率不高。
重要的是要认识到两个正交概念:
- 你可以在迁移期间执行自定义代码。
- 你可以拥有版偏移检测和迁移引导的自定义代码。
迁移策略类允许你以多种方式自定义实体和属性的迁移,这些通常是你需要的。但是,你可能会使用自定义偏移检测和迁移引导(自举),以便你可以控制迁移过程。例如,如果您有非常大的储存,则可以使用两个数据模型设置迁移管理器,然后使用一系列映射模型将数据迁移到目标储存中(如果对每个调用使用相同的目标URL,Core Data将对新对象添加到现有储存中)。这允许框架(和你)在转换过程中限制内存中的数据量。
默认迁移流程
要打开储存并执行迁移(如果有必要):请使用addPersistentStoreWithType:configuration:URL:options:error:方法,并且将选项添加到密匙为NSMigratePersistentStoresAutomaticasllyOption的条目中,该值为表示“YES”的NSNumber对象。你的代码与下示类似:
Listing 6-1 Opening a store using automatic migration
NSError *error;
NSPersistentStoreCoordinator *psc = <#The coordinator#>;
NSURL *storeURL = <#The URL of a persistent store#>;
NSDictionary *optionsDictionary =
[NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES]
forKey:NSMigratePersistentStoresAutomaticallyOption];
NSPersistentStore *store = [psc addPersistentStoreWithType:<#Store type#>
configuration:<#Configuration or nil#>
URL:storeURL
options:optionsDictionary
error:&error];
如果迁移成功,则在您的任何文件拓展名和已迁移的储存保存到storeURL之前,storeURL上的现有储存将已“~”后缀重新命名。
在执行addPersistentStoreWithType:configuration:URL:options:error:时,Core Data执行以下操作:
- 尝试查找可用于打开储存的托管对象模型
Core Data依次搜索应用程序的资源模型以进行测试。如果找不到合适的模型,Core Data将返回一个nil和一个合适的错误(error)。 - 尝试找到从现有储存的托管对象模型映射到永久储存协调器正在使用的映射模型。
Core Data通过应用程序的资源搜索可用的映射模型并一次进行测试。如果找不到合适的映射,则Core Data将返回NO和一个合适的错误(error)。
请注意:必须创建一个合适的映射模型才能使此阶段成功。 - 创建映射模型所需的迁移策略对象的实例。
注:即使你使用默认迁移过程,也可以使用自定义迁移策略类自定迁移。