手动核心数据版本控制

我开发了一个应用程序, iCollege ,现在我想让应用程序更好。
测试时我想从备份中恢复数据。 在启动iCollege时,应用程序崩溃,因为它无法通过Core Data进行版本控制。 我现在的问题是,是否可以手动版本化核心数据文件,即遍历现有文件的每个受管对象并使对象适合活动的模型版本。

有可能吗?

编辑:非常感谢您快速详细的回答。 我认为我解释的问题并不是很好。 这是我的问题的另一种描述。
我有一个使用Core Data创建的文件,其中包含一些实体CourseTeacher对象。 我用这个文件替换我的应用程序的核心数据文件。 当应用程序下次启动时,我想调用一个方法,该方法使用CourseTeacher的对象读取文件的Managed Objects,并将其转换为Entities,例如SubjectProfessor 。 属性也可能会改变。 我的问题是,如果我能做到这一点,即我可以自己修改Core Data文件吗?
我希望我的问题现在可以检查。 🙂

您可以按如下方式执行此操作。 核心数据允许您向NSPersistentStoreCoordinator添加多个持久存储,因此您需要两个与协调器关联的存储。 请注意,无法使用两个不同的托管对象模型(MOM),您的所有商店只能有一个MOM。

虽然这可能看起来相当困难,但考虑到Core Data也允许使用配置,它相当简单。 配置具有名称和关联的实体集。 这些集可能重叠 – 也就是说,给定实体可能出现在多个配置中。 请参阅相关文档

您现在可以通过在不同的商店中使用不同的实体来轻松处理您的问题,创建一个模型,该模型将是您要处理的所有实体(或至少是联合)的超集,并定义您需要的子集。配置。 然后,为每个单独的商店指定关联的配置。

像(只是一个示例代码段):

 NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] init]; [coordinator addPersistentStoreWithType:type configuration:@"CourseAndTeacher" URL:aURL options:nil error:NULL]; [coordinator addPersistentStoreWithType:type configuration:@"SubjectAndProfessor" URL:anotherURL options:nil error:NULL]; NSManagedObjectContext *context = [[NSManageObjectContext alloc] init]; [context setPersistentStoreCoordinator:coordinator]; 

理论上,您可以手动迁移数据,但这可能不值得。 您想使用automatic lightweight migration

要执行自动轻量级迁移,您需要设置两个数据模型,然后在代码中告知Core Data执行迁移。 这意味着在完成阅读之前不应修改数据模型 。 如果您有(自动或手动)恢复旧模型。 你需要它来进行迁移。 以下是自动轻量级迁移的工作原理:

首先,您需要为数据模型添加模型版本。 选择现有模型,然后从“ Editor菜单中添加一个版本:

选择型号

添加模型版本

系统将提示您为数据模型命名,并选择基于该模型的现有模型。

在此处输入图像描述

现在,继续对新模型进行更改。 完成后,您需要告诉Core Data将此新模型用作当前版本。 我们还没有达到代码,所以这部分很简单。 (代码也很简单。)在右侧面板上,选择活动模型,如下所示:

在此处输入图像描述

确保在左侧导航器中选择了您的模型,否则您可能看不到右侧的选项。 你应该得到这样的东西:

在此处输入图像描述

(我实际上在这里使用版本2而不是版本3,但想法是一样的。)

现在,您需要快速更改代码,以便Core Data知道为您执行迁移。

在app delegate中的persistentStoreCoordinator方法内部,更改以下行:

 if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]){ 

如下(在if语句前面的行中添加):

  NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]){ 

您基本上向Core Data传递了一个选项字典,告诉它为您迁移数据存储。 (仔细看看前面的代码,经过几次阅读后它会有意义。)

编辑:你可能可以做你想做的事。 如果我理解正确,您应该创建一个新的模型版本,执行轻量级迁移,然后手动进行所需的更改。 我的上述答案仍然有效,除了您之后想要进行一些手动更改。