NSPersistenceFrameworkVersions 251 和 358 之间的核心数据迁移失败

Posted

技术标签:

【中文标题】NSPersistenceFrameworkVersions 251 和 358 之间的核心数据迁移失败【英文标题】:Core Data migration failure between NSPersistenceFrameworkVersions 251 and 358 【发布时间】: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 似乎在引发异常之前关闭了连接。 【参考方案1】:

为了澄清, 使用带有数据库文件路径作为参数的 unix sqlite3 工具。 您可以通过从管理器的设备窗格中的设备应用程序下拉取应用程序的 db 文件...您将获得一个包。

为表格标题键入“.headers on”

为具有对象之间引用的实体查找表(.tables 命令)

其中 Z_1REFERENCEDSETOFOBJECTS 是您的表的名称。

select * from Z_1REFERENCEDSETOFOBJECTS limit 2

查找表头的名称;然后为具有 REFLEXIVE 列的表运行以下命令:

ALTER TABLE Z_1REFERENCEDSETOFOBJECTS ADD FOK_REFLEXIVE integer

把它往下推。

【讨论】:

【参考方案2】:

此错误似乎已在 iOS 5.1 和 OSX 10.7.3 中修复

【讨论】:

请扩展一些示例、演示、文档链接。

以上是关于NSPersistenceFrameworkVersions 251 和 358 之间的核心数据迁移失败的主要内容,如果未能解决你的问题,请参考以下文章