3

我有一个核心数据迁移的问题,它以我不理解的方式失败。

我有一个从旧版本的数据模型的迁移路径,看起来像这样:

  1. v1 - 初始模型
  2. v2 - 需要轻量级迁移
  3. v3 - 需要轻量级迁移
  4. v4 - 需要自定义迁移
  5. v5 - 轻量级迁移

我正在整理一个集成测试来运行从 v1 到当前的迁移。我写了一个小助手,可以查询当前存储,并给定一个模型,运行正确类型的迁移。这或多或少有效,但我在自定义迁移步骤中遇到了我在概念上不理解的错误。

我正在使用具有以下描述的NSMigrationManager::migrateStoreFromURL :

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

测试用例在 v1 sqlite 存储中复制并成功自动迁移到 v3,然后在自定义迁移中失败并出现以下错误:

NSUnderlyingError: Error Domain=NSCocoaErrorDomain Code=134100 “操作无法完成。(Cocoa 错误 134100。)”

UserInfo=0x210d740 {元数据={ NSPersistenceFrameworkVersion = 419; NSStoreModelVersionHashes = { 这篇文章中有很多哈希值...}; NSStoreModelVersionHashesVersion = 3; NSStoreModelVersionIdentifiers = ( "" ); NSStoreType = SQLite;NSStoreUUID = "0D2C0907-5F60-4EED-A61B-E726EEB0DA68"; "_NSAutoVacuumLevel" = 2; }, reason=开店的机型和开店的机型不兼容

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

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

4

1 回答 1

1

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

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

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

作为健全性检查,您可能希望尝试在版本 3 和 4 之间生成一个新的、干净的、普通的映射模型,无需编辑,以确保您的映射模型和实际用于生成的模型之间没有任何不同步。店铺。您也可以在当前使用轻量级迁移的两个模型之间尝试相同的方法,以查看在这些情况下是否会出现问题,如果这是由于哈希值错误引起的,则可以预期。

于 2013-07-06T04:01:44.630 回答