在非连续版本之间迁移时出现核心数据迁移错误

Posted

技术标签:

【中文标题】在非连续版本之间迁移时出现核心数据迁移错误【英文标题】:Core Data Migration error when migrating between non-consecutive versions 【发布时间】:2011-04-08 11:12:42 【问题描述】:

问题

我的核心数据模型有 13 个版本。 我已经制作了 13 个映射模型(V1-V2、V2-V3 等) 我已开启自动迁移。 在两个连续版本(例如 V12-V13)之间迁移时,迁移工作完美

在两个非连续版本(例如 V11-V13)之间迁移时,迁移失败并出现以下错误:

Can't find mapping model for migration

我尝试过的

为每个可能的版本组合创建一个映射模型。这可行,但确实很麻烦。

对于第 14 版,我需要制作 14 种不同的映射模型。手动。呃。

代码

这是我为迁移传递的选项:

[persistentStoreCoordinator addPersistentStoreWithType:[self storeType]
                                          configuration:nil 
                                                    URL:url 
                                                options:[NSDictionary dictionaryWithObjectsAndKeys:
                                                         [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                                                         [NSNumber numberWithBool:NO], NSReadOnlyPersistentStoreOption,
                                                         nil]
                                                  error:&error])

数据模型

我的数据模型相当复杂,但这里是:http://dl.dropbox.com/u/136780/Engine_V2_DataModel.xcdatamodeld.zip

我现在没有在我的数据模型中使用任何版本哈希修饰符或重命名标识符。

【问题讨论】:

为什么有映射模型V1-V2、V2-V3、V3-V4等。什么时候可以有 V1-V14、V2-V14、V3-V14 等?后者允许您一步完成迁移。 我的目标是 V1-V2、V2-V3 等设置,因为它更容易。每当您想进行一次迁移时,手动创建 14 个映射模型并不好玩。此外,我看到的所有文档都暗示 V1-V2、V2-V3 等是迁移商店的官方方式。我觉得我做错了什么。 【参考方案1】:

查看这个 Stack Overflow 问题:Core Data Migration Across Multiple Version Upgrades

基本上,要点是您不需要创建完整的映射模型集。您只需要在每对连续模型之间映射模型,然后您就可以将任何旧模型通过中间模型逐步迁移到最新模型。

性能可能不好,具体取决于您的商店,因为您不是一步完成迁移的。不过,这可能已经足够好,并且不必创建完整的映射模型集可能是值得的。您还可以测试此方法的性能,以确定是否需要在模型的非连续版本之间创建映射。

Marcus Zarra(卓越的核心数据爱好者)在此处提供代码:http://media.pragprog.com/titles/mzcd/code/ProgressiveMigration/AppDelegate.m

(我正要问这个问题,但感谢 LazyTwitter,我被 Aaron Tuller 指出了这个答案:https://twitter.com/tullera/status/57708304683642880)

【讨论】:

西蒙妮,非常感谢。我很震惊,我实际上做得对。由于我拥有大量数据,因此一次迁移可能需要几分钟,因此分阶段迁移对我来说并不实用。看起来多个映射是唯一的方法。垃圾! Macrus Zarra 的代码很棒,我强烈推荐他关于核心数据的书。也就是说,如果它发现 .mom 文件的顺序错误,我必须对其进行以下更改以防止它无限递归:gist.github.com/2321704 3 年后...这仍然是最好的解决方案吗? 我有 95% 的把握,即使是最新版本的 Core Data,这里也没有任何变化。如果您只想一步获得最佳性能和迁移,您仍然必须为每个可能的版本组合制作映射模型。请注意,当然,如果您包括 NSInferMappingModelAutomaticallyOption 以及 NSMigratePersistentStoresAutomaticallyOption 选项,这将为您省去很多麻烦。我们有 21 个模型版本,它们都可以推断出它们的映射模型(而不是我们制作显式映射模型),没有任何问题。

以上是关于在非连续版本之间迁移时出现核心数据迁移错误的主要内容,如果未能解决你的问题,请参考以下文章

添加迁移EF Core时出现奇怪错误

Laravel 5.2 迁移第二个表时出现数据库迁移错误

尝试迁移 Laravel 数据库时出现错误

使用 Laravel 迁移创建外键时出现 MySQL 错误

使用Laravel迁移创建外键时出现MySQL错误

使用查询数据库的默认字段函数迁移时出现 Django 错误