【问题标题】:Missing Mapping Model after editing the model编辑模型后缺少映射模型
【发布时间】:2014-01-25 20:07:52
【问题描述】:

我正在进行手动核心数据迁移,并不断遇到 Cocoa 错误 134140:NSMigrationMissingMappingModelError。我注意到每当我对模型进行任何更改时都会发生这种情况,即使是像将属性标记为可选这样的小事。到目前为止,发生这种情况时我发现的唯一解决方案是删除我的映射模型并创建一个新的映射模型。有没有更好、更简单的解决方案?

【问题讨论】:

    标签: ios xcode core-data migration core-data-migration


    【解决方案1】:

    有一个菜单选项可以解决这个问题。如果您在创建映射模型后随时更新模型,只需执行以下操作:

    1. 选择映射模型。
    2. 选择编辑器 -> 刷新数据模型。

    【讨论】:

    • 这么简单,我已经用头撞墙两天了。
    【解决方案2】:

    汤姆是对的,但我会更进一步。我永远不会进行手动/大量迁移。如果不能在轻量级迁移中完成,请考虑进行导出/导入。这将比大量迁移更快、更高效。

    我的标准建议是让您的更改保持足够小,以便您始终可以进行轻量级迁移。

    导入/导出更新

    重量级迁移是对内存便宜的 OS X 的延续。它不应该在 iOS 中使用。那么正确答案是什么?

    我对人们的建议是自己处理。尽可能进行轻量级迁移,即使它需要遍历多个模型才能从 A 到 B。但是在您的情况下,这听起来不太可能。

    所以第二个选项是导出/导入。将核心数据导出为 JSON 非常容易。我什至在Stack Overflow post 中做了一个简单的例子。

    首先,您要建立旧模型和当前商店。这涉及找到正确的模型版本并使用[[NSManagedObjectModel alloc] initWithContentsofURL:] 手动加载它并指向正确的模型版本。在我的书中有关于如何找到正确模具版本的详细信息(笑)。

    然后将当前模型导出为 JSON。那应该相当快。但是,出于显而易见的原因,请勿在您的 -applicationDidFinish.. 中执行此操作。

    第二步是使用“当前”模型加载新的 Core Data 堆栈并导入该 JSON。由于该 JSOn 采用已知格式,因此您可以相当轻松地导入它。

    这将使您能够控制整个体验并避免大量迁移所带来的问题。

    【讨论】:

    • 该应用程序已经在商店中上线,客户想要进行大规模更改,这迫使团队对数据模型(以及应用程序的其余部分)进行大规模更改。你能扩大进口/出口吗?我的谷歌搜索没有发现任何与对我有帮助的东西。我要做的是将一个实体拆分为 3 个实体,同时保持所有 3 个实体之间的关系。
    【解决方案3】:

    发生这种情况是因为:

    • 迁移映射通过实体哈希标识模型文件,并且
    • 更改实体时,也更改了其哈希值。

    当你更改模型时,地图不再匹配,迁移失败,因为找不到匹配的地图。

    解决方法是在确定新模型的外观之前不要乱用迁移。然后使用模型的最终版本创建地图。如果您无法最终确定新模型并需要进行迁移,那么您已经找到了必要的程序。

    【讨论】:

    • 我认为是这样的。谢谢!
    • @skladek 这就是它发生的原因,但不需要解决方法。有一个菜单选项可以纠正它。请参阅下面的答案。
    猜你喜欢
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多