Core Data自定义迁移失败:无法添加目标存储

时间:2013-07-05 17:32:32

标签: ios objective-c core-data

我遇到了一个核心数据迁移问题,这个问题以我不理解的方式失败。

我有一个旧版数据模型的迁移路径,如下所示:

  1. v1 - 初始模型
  2. v2 - 需要轻量级迁移
  3. v3 - 需要轻量级迁移
  4. v4 - 需要自定义迁移
  5. v5 - 轻量迁移
  6. 我正在整合一个集成测试来运行从v1到current的迁移。我写了一个小助手,可以查询当前商店,并给出一个模型,运行适当类型的迁移。这或多或少都有效,但我在自定义迁移步骤中遇到了一个错误,我从概念上并不理解。

    我正在使用NSMigrationManager::migrateStoreFromURL,其中包含以下说明:

    将指定源URL处的存储迁移到目标URL处的存储,执行映射模型中的所有映射。商店必须存在于源URL;如果目标URL上不存在商店,则会创建一个商店(否则迁移将附加到现有商店。)调用此方法将对源模型和目标模型(以及映射模型)执行兼容性检查。如果出现错误在验证或迁移过程中,此方法将返回NO。

    测试用例在v1 sqlite商店中复制并成功自动迁移到v3,然后在自定义迁移时因此错误而失败:

      

    NSUnderlyingError:错误域= NSCocoaErrorDomain代码= 134100“操作无法完成。(可可错误134100)。”

         

    UserInfo = 0x210d740 {metadata = {       NSPersistenceFrameworkVersion = 419;       NSStoreModelVersionHashes = {很多哈希在这篇文章中都是噪音...};       NSStoreModelVersionHashesVersion = 3;       NSStoreModelVersionIdentifiers =(           “”       );       NSStoreType = SQLite;       NSStoreUUID =“0D2C0907-5F60-4EED-A61B-E726EEB0DA68”;       “_NSAutoVacuumLevel”= 2;   }, reason =用于打开商店的模型与用于创建商店的模型不兼容

    所以,回顾一下,我只有源存储,它已自动迁移到v3。我没有目的地商店,我希望依靠NSMigrationManager来创建目的地商店。对我而言,由于模型与不存在的商店不匹配而导致迁移失败,这对我没有意义。有什么想法吗?

    只是为了额外的上下文,在调试时,我已经验证我正在将所有参数的适当实例传递给方法。已加载源模型和目标模型,通过查询源模型和目标模型从测试包中加载用于自定义迁移的映射模型(一个有希望的结果,因为如果有任何错误,这将失败),以及URL的对于sqlite商店来说是正确的。

1 个答案:

答案 0 :(得分:1)

首先,确保将 -com.apple.CoreData.MigrationDebug 1 添加到Xcode方案中启动时传递的参数中。然后小心来信任输出!

匹配某些模型和映射模型存在问题,显然是由于不正确的哈希值,不会影响轻量级迁移。我目前正在与此作斗争,但我无法隔离触发此问题的条件,因此如果您能够找出问题,请提交详细的错误!

如果您可以访问iOS 7测试版,那么调试输出可能会更有帮助。在iOS 6中,调试输出哈希值始终在映射模型和托管对象模型之间匹配,因此调试输出中显然存在错误。使用iOS 7,如果这是您的问题,您可能能够隔离哪些实体存在不匹配,并隔离触发该问题的特征(我到目前为止无法做到这一点)。

正如完整性检查一样,您可能想尝试在版本3和版本4之间生成一个新的,干净的,普通的映射模型,而不进行编辑,以确保映射模型与模型实际使用之间没有任何不同步生成商店。您也可以在当前使用轻量级迁移的两个模型之间尝试相同的方法,以查看在这些情况下是否出现问题,如果这是由于哈希值错误可能会出现的情况。