使用拆分核心数据模型进行迁移

Migration with split core data model

该项目(一个静态库)有一个单一的数据模型,其中包含实体,这些实体实际上可以按关注点分组并放入单独的数据模型中,但没有分开,因为在项目设计之初并没有出现必要性.但现在随着项目的发展,我们正在重构代码以将其模块化,数据模型必须拆分为一个单一的核心数据模型,而属于每个 module.The 挑战的其他模型现在是我们无法弄清楚如何在这种情况下安全迁移。

说清楚---

现在为了安全迁移,我希望将当前应用程序中属于原始 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 管理。它工作得很好,虽然看起来有点不整洁,但我无法单独使用迁移策略来解决。如果有更好的方法,我会很感兴趣。