轻量级Core Data迁移后崩溃

时间:2015-06-13 15:52:11

标签: ios core-data

我正在尝试掌握代码数据迁移,它对于支持我的应用程序非常重要。我需要迁移的原因是保留数据。我的应用程序用于心理研究和收集反应时间数据。我有一个游戏会话,每个游戏会话都有一系列动作。每一步都有一些属性。其中一个属性是interval: Date。在商店版本1中,它被命名为 date ,在版本2中,我将其重命名为 interval ,并将属性的模型版本标识符更改为 date。

应用程序在启动时没有崩溃,但是当我尝试查看旧日志时崩溃。我有UITextView,我会像这样显示所有日志:

textView.text = "Interval = \(move.interval)"

如果我创建新游戏会话并将查看其日志 - 该应用程序可以正常工作。

保护用户的最佳方法是什么?我应该在我的应用程序中添加额外的逻辑吗?如何在重命名属性后显示旧数据?

更新

控制台中没有消息,应用程序停止使用代码行更新UITextView,它以绿色突出显示,并显示错误消息:

Thread 1: EXC_BAD_ACCESS (code=1, address=0x0)

1 个答案:

答案 0 :(得分:0)

我从头开始尝试,而不是重命名变量,我创建了新的变量。这次应用程序没有崩溃。对不起,这不是真正的答案,但它帮助我继续前进。

我学到的经验教训:

  1. 不要在Xcode检查器中混淆核心数据模型标识符并重命名ID。有一个模型标识符(我把它留空)并重命名每个属性的ID。
  2. 如果您使用NSNumber生成了Core Data生成的类,请不要尝试在控制台中显示它们,如下所示:label.text = "number = \(object.number)"
  3. 这样做:

    label.text = "number = \(object.number.integerValue)"
    

    这个给了我相同的崩溃消息,但是如果您使用NSDate则不会有问题。

    重命名变量时仍然有问题。当我今天再次应用我的提交时,我正在使用Can't find model for source store消息开始崩溃。模拟器中的应用程序已更改,因此看起来我无法再重现此问题,而是换了一个新问题。

    <强>更新

    我有更多练习,我认为我能够修复上述崩溃。

    我添加了下一个数据模型版本 - 版本3并引入了新变量。我之前做过,将当前版本从2切换到3.然后应用程序在Can't find model for source store启动时开始崩溃。我注意到,当我删除引入的变量时,应用程序没有崩溃。我发现我的核心数据无法迁移到版本3,因为它已经在版本3上了:

    1. 我将版本从2更改为3.我没有更改Core Data模型。
    2. 我更改了我的代码,修复了一些与Core Data无关的错误。
    3. 在模拟器中构建并运行项目。注意,现在模拟器中的应用程序具有数据版本3.
    4. 更改了基于模拟器的核心数据模型。它在这一步之后崩溃了。
    5. 我采取了哪些措施来解决这个问题:

      1. 删除引入的变量。您可以按原样生成生成的类。
      2. 将当前版本更改为上一个版本。就我而言,从2到3。
      3. 运行该应用并退出。
      4. 更改Core Data当前版本并添加新变量。
      5. 运行应用程序 - 它有效。
      6. 更新2

        我再次遇到这个问题,我的回答没有帮助。在我上面描述的所有内容之后仍然是事件。

        我发现this answer这次最终解决了这个问题。秘诀是新属性不应该是可选的,它们应该有默认值。