处理核心数据的问题

Posted

技术标签:

【中文标题】处理核心数据的问题【英文标题】:Problem in working with core data 【发布时间】:2011-05-13 08:27:48 【问题描述】:

我在我的可可应用程序中使用核心数据框架,我创建了几个实体并使用 NSEntityDescription 创建了引用。当我运行应用程序时,我收到一条错误消息,提示“用于打开持久存储的托管对象模型版本与用于创建持久存储的版本不兼容。”

【问题讨论】:

【参考方案1】:

您需要从您的设备/模拟器中删除应用程序,然后重新构建并运行。

每次更改模型时都会发生这种情况,因为旧数据存储将保留在应用程序文档文件夹中,而访问它的类已更改。

在开发的后期,您可能希望引入商店迁移,这样您的测试人员和用户就不必在每次发布新版本时删除他们的数据。但是,如果您的模型保持静态,则无需在以后的更新期间迁移数据。

您可能需要查看Core Data Migration Programming Guide 以了解更多信息。

【讨论】:

【参考方案2】:

答案有点棘手,但这对我来说总是有效的。这是为了干净安装新的兼容 .sqlite 文件,不是迁移

启动模拟器,删除应用和数据(删除应用后的弹出窗口)。

退出模拟器

在对数据模型进行任何编辑后打开 X-Code

删除*appname*.sqlite文件(或备份,从项目文件夹中删除,并删除引用)

清理应用程序 (Product > Clean)

在模拟器中运行应用程序(对于本教程,我将假设 4.2)

模拟器运行时,在 Finder 窗口中,导航至: *home* > Library > Application Support > iPhone Simulator > 4.2 > Applications > *random identifier* > Documents > *appname*.sqlite

复制此文件到另一个位置

停止在 X-Code 中运行您的应用

appname.sqlite 文件拖放到 X-Code 中的文件列表中。

在弹出的对话框中,确保选中copy to folder 复选框。

Product > Clean

然后在模拟器中再次运行应用程序

现在你应该有一个可以工作的 sqlite 文件了!

干杯, 罗伯特

【讨论】:

【参考方案3】:

您必须从以下任一位置删除持久存储文件:

~/Library/$AppName ~/Library/Application Support/$AppName

(取决于您的 Xcode 版本。)

【讨论】:

以上是关于处理核心数据的问题的主要内容,如果未能解决你的问题,请参考以下文章

在核心数据管理类中处理 NSManagedObjectContexts

核心数据在后台线程上缓慢处理更新

将对象插入核心数据实体时处理重复项

iOS - 核心数据 - 完成处理程序

处理 NSFetchedResultsController DidChangeSection IOS 核心数据

我怎样才能明智地处理版本控制和核心数据模型?