【发布时间】:2011-09-24 00:46:17
【问题描述】:
我在 OS X 10.7.1 中遇到了一个似乎是 Core Data 的错误。
我的数据存储 (NSSQLiteStoreType) 未正确自动迁移。
附带说明,iOS 版本的应用使用完全相同的 Core Data 模型。
-> 这似乎是正在发生的事情。
直到最新版本一切正常——
我对模型进行了 14 次修订 -- 模型 13 已经发货了很长一段时间,没有发生任何事故。
最近我更新了我的应用程序并添加了一个新模型,所以我 14 岁(这是现在在运输应用程序中使用的版本)。
iOS 版本在从模型 13 迁移到 14 时运行良好——因此无需担心。
所以与其谈论 OS X 版本,不如使用 NSPersistenceFrameworkVersions
NSPersistenceFrameworkVersions 251 为 10.6.8,NSPersistenceFrameworkVersions 358 为 10.7.1
如果我们使用类似的版本——即模型 13 版本 251 并迁移到模型 14 版本 251,它可以正常工作。
如果我们使用模型 13 版本 358 并迁移到模型 14 版本 358 也是如此,它也可以正常工作
这就是有趣的地方
如果我们将模型 13 版本 358 迁移到模型 14 版本 251,它仍然可以正常工作
但是,从模型 13 版本 251 迁移到模型 14 版本 358 并不工作
CoreData: 错误: (1) 数据库的 I/O 错误等等。 SQLite 错误代码:1,'没有这样的列:FOK_REFLEXIVE'
同样,这只发生在从 10.6.8 (NSPersistenceFrameworkVersions 251) 到 10.7.1 (NSPersistenceFrameworkVersions 358) 时,所有其他排列都可以正常工作。
以下是传递给 addPersistentStoreWithType 的用于迁移的选项。
// Allow inferred migration from the original version of the application.
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
最后一件事,如果我们只向模型 14 添加属性,转换将不会中断。只有添加实体才会导致其破坏。
其他人看到这种问题。 - 提前致谢。
【问题讨论】:
-
我在 iOS 5 beta 上使用 Core Data 时遇到了类似的问题。我已经能够通过删除该项目并重新创建它来解决此问题,但无法保存所有数据。
-
@Jason - 你找到解决方案了吗 - 丢失数据对我来说并不是一个真正的选择! :)
-
我实际上破解了核心数据,因此如果表没有列,我通过直接 SQLite 操作手动添加它。它不漂亮,但效果很好。
-
问题似乎与推断映射有关。提供映射模型 (xcmapingmodel) 可以解决问题。
-
@Jason:你有详细的说明吗?我正在尝试捕获异常并重新执行 SQL,但这失败了,因为 NSSQLiteConnection 似乎在引发异常之前关闭了连接。
标签: core-data osx-lion core-data-migration