使用拆分核心数据模型进行迁移
Migration with split core data model
该项目(一个静态库)有一个单一的数据模型,其中包含实体,这些实体实际上可以按关注点分组并放入单独的数据模型中,但没有分开,因为在项目设计之初并没有出现必要性.但现在随着项目的发展,我们正在重构代码以将其模块化,数据模型必须拆分为一个单一的核心数据模型,而属于每个 module.The 挑战的其他模型现在是我们无法弄清楚如何在这种情况下安全迁移。
说清楚---
- 一开始---项目(没有模块)
有一个名为 CoreDataModel 的单一数据模型和实体,
A B C D。
- 现在 -------------- 项目有 1 个模块(一个单独的静态库本身与主项目库
作为依赖项),原始 CoreDataModel 分为两个 1)具有实体 A、B 的 CoreDataModel。 2) ModuleDataModel 实体 C,D.
现在为了安全迁移,我希望将当前应用程序中属于原始 CoreDataModel(在文件 CoreData.sqllite 中)的数据单独(相对于它们所属的实体)放入 CoreData.sqllite 和ModuleData.sqllite。
阅读你的第一句话,我假设你的 "CoreDataModel" 和 "ModuleDataModel" 完全分离,即 (A 或 B) 和 (C 或 D) 之间没有关系。
我可能会尝试使用一个或多个 NSEntityMigrationPolicy 和指定的 NSMigrationManager 执行迁移,使用(代码片段):
NSMigrationManager *migrationManager=[[NSMigrationManager alloc] initWithSourceModel: sourceModel destinationModel: destModel];
BOOL success=[migrationManager migrateStoreFromURL: sourceStoreURL type: NSSQLiteStoreType options: nil withMappingModel: mappingModel toDestinationURL: destinationStoreURL destinationType: NSSQLiteStoreType destinationOptions: nil error: &migrationError];
您的迁移策略可以覆盖:
- (BOOL) createDestinationInstancesForSourceInstance: (NSManagedObject*) instance entityMapping: (NSEntityMapping*) mapping manager: (NSMigrationManager*) manager error: (NSError* __autoreleasing *) error
在此期间,您可以将相关的 (C, D) 源实体的属性(和 entityType)存储在字典中,将其添加到数组并将该数组存储在 -[NSMigrationManager userInfo] 中 词典。在此阶段,您实际上只会将 A、B 实体迁移到您的新商店。
一旦初始迁移完成(通常在设置主/"CoreData" persistentStoreCoordinator 时),您可以检索 migrationManager 的 userInfo 字典并存储字典数组,例如在您的应用委托/核心数据控制器的 属性 中。
一旦 NSManagedContexts 被初始化,"CoreData" 应该被正确迁移,但是 "ModuleData" 将是空的。然后您可以遍历存储的数组,创建 C 和 D 的新实体并设置它们的属性。
我没有介绍 C 和 D 关系的额外复杂性,但希望这将是指向正确方向的指针。当我想将一个标准 MOM/PSC/MOC 分成一个 MOM/MOC 时,我做了类似的事情,其中有两个磁盘存储,由同一个 PSC 管理。它工作得很好,虽然看起来有点不整洁,但我无法单独使用迁移策略来解决。如果有更好的方法,我会很感兴趣。
该项目(一个静态库)有一个单一的数据模型,其中包含实体,这些实体实际上可以按关注点分组并放入单独的数据模型中,但没有分开,因为在项目设计之初并没有出现必要性.但现在随着项目的发展,我们正在重构代码以将其模块化,数据模型必须拆分为一个单一的核心数据模型,而属于每个 module.The 挑战的其他模型现在是我们无法弄清楚如何在这种情况下安全迁移。
说清楚---
- 一开始---项目(没有模块) 有一个名为 CoreDataModel 的单一数据模型和实体, A B C D。
- 现在 -------------- 项目有 1 个模块(一个单独的静态库本身与主项目库 作为依赖项),原始 CoreDataModel 分为两个 1)具有实体 A、B 的 CoreDataModel。 2) ModuleDataModel 实体 C,D.
现在为了安全迁移,我希望将当前应用程序中属于原始 CoreDataModel(在文件 CoreData.sqllite 中)的数据单独(相对于它们所属的实体)放入 CoreData.sqllite 和ModuleData.sqllite。
阅读你的第一句话,我假设你的 "CoreDataModel" 和 "ModuleDataModel" 完全分离,即 (A 或 B) 和 (C 或 D) 之间没有关系。
我可能会尝试使用一个或多个 NSEntityMigrationPolicy 和指定的 NSMigrationManager 执行迁移,使用(代码片段):
NSMigrationManager *migrationManager=[[NSMigrationManager alloc] initWithSourceModel: sourceModel destinationModel: destModel];
BOOL success=[migrationManager migrateStoreFromURL: sourceStoreURL type: NSSQLiteStoreType options: nil withMappingModel: mappingModel toDestinationURL: destinationStoreURL destinationType: NSSQLiteStoreType destinationOptions: nil error: &migrationError];
您的迁移策略可以覆盖:
- (BOOL) createDestinationInstancesForSourceInstance: (NSManagedObject*) instance entityMapping: (NSEntityMapping*) mapping manager: (NSMigrationManager*) manager error: (NSError* __autoreleasing *) error
在此期间,您可以将相关的 (C, D) 源实体的属性(和 entityType)存储在字典中,将其添加到数组并将该数组存储在 -[NSMigrationManager userInfo] 中 词典。在此阶段,您实际上只会将 A、B 实体迁移到您的新商店。
一旦初始迁移完成(通常在设置主/"CoreData" persistentStoreCoordinator 时),您可以检索 migrationManager 的 userInfo 字典并存储字典数组,例如在您的应用委托/核心数据控制器的 属性 中。
一旦 NSManagedContexts 被初始化,"CoreData" 应该被正确迁移,但是 "ModuleData" 将是空的。然后您可以遍历存储的数组,创建 C 和 D 的新实体并设置它们的属性。
我没有介绍 C 和 D 关系的额外复杂性,但希望这将是指向正确方向的指针。当我想将一个标准 MOM/PSC/MOC 分成一个 MOM/MOC 时,我做了类似的事情,其中有两个磁盘存储,由同一个 PSC 管理。它工作得很好,虽然看起来有点不整洁,但我无法单独使用迁移策略来解决。如果有更好的方法,我会很感兴趣。