应用程序因数据模型的更改而崩溃

时间:2011-08-23 04:06:43

标签: iphone objective-c

当我更改数据模型时,我的应用程序崩溃了。为了再次运行它我应该从模拟器中删除应用程序并运行它。除了这样做之外,我们可以运行应用程序,而无需在每次更改数据模型时删除。我想要使​​用以前的数据。提前致谢

4 个答案:

答案 0 :(得分:4)

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

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

退出模拟器

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

如果需要,请更新datamodel版本:

  1. Editor > Add Model Version...
  2. 在出现的对话框中设置您的首选项(最好是计数)
  3. 点击{ appname }。xcdatamodeld然后在最右边的窗格中
  4. 点击最右列顶部3个图标的左侧图标
  5. Versioned Core Data Model下选择您刚创建的
  6. 删除{*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文件!

    干杯, 罗伯特

答案 1 :(得分:3)

基本上,您需要能够将现有数据迁移到新架构 - 请阅读Core Data Versioning and Data Migration

答案 2 :(得分:1)

用于NSPersistentStore的文件一次只能对应一个数据模型版本。您需要将数据迁移到新版本,或者告诉应用程序每次启动时都删除持久性存储文件(仅用于开发目的)。

只是看到你想要保留旧数据。您可以尝试将数据序列化为NSDictionary,然后将其保存到plist / json / xml文件中。然后,当您的程序启动时,您可以删除旧的NSPersistantStore文件并创建一个新文件。将plist / json / xml文件中的数据导入新的空持久存储文件。

请记住,为了实现轻量级迁移,除了新版本之外,还需要保留以前版本的数据模型。核心数据需要知道过去和现在的两种模型才能执行迁移。

答案 3 :(得分:0)

我有同样的问题,我还没有解决它。我不在乎。当我的应用程序处于开发阶段时,我只是在每次更改模型时清除数据。

我认为使用轻量级迁移,您仍然需要为要迁移或迁移的每个版本的数据模型复制数据模型。它是轻量级的,但不足以在早期开发中频繁更改数据模型时使用。

我建议您在无法加载数据时捕获它抛出的异常,并让程序在这种情况下自动删除数据并在初始状态下重新创建它。它与忽略问题答案相同,但您不必每次都手动删除数据。您可能应该将该代码保留用于生产,作为备份,以防由于某种原因迁移不起作用,但也许您应该询问用户是否要删除数据。