我有一个核心数据迁移的问题,它以我不理解的方式失败。
我有一个从旧版本的数据模型的迁移路径,看起来像这样:
- v1 - 初始模型
- v2 - 需要轻量级迁移
- v3 - 需要轻量级迁移
- v4 - 需要自定义迁移
- 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 商店看起来不错。