轻量级核心数据迁移后崩溃
Posted
技术标签:
【中文标题】轻量级核心数据迁移后崩溃【英文标题】:Crashing after lightweight Core Data migration 【发布时间】:2015-06-13 15:52:11 【问题描述】:我正在尝试掌握代码数据迁移,这对于支持我的应用程序非常重要。我需要迁移的原因是为了保留数据。我的应用程序用于心理研究和收集反应时间数据。我有一个游戏会话,每个游戏会话都订购了一组动作。每一个动作都有一些属性。其中一个属性是interval: Date
。在商店版本 1 中,它被命名为 date,在版本 2 中,我将其重命名为 interval,并将属性的模型版本标识符更改为 date。
应用程序在启动时没有崩溃,但是当我尝试查看我的旧日志时它崩溃了。我有UITextView
,我会像这样显示我的所有日志:
textView.text = "Interval = \(move.interval)"
如果我创建新的游戏会话并查看其日志 - 应用程序可以正常工作。
保护我的用户的最佳方式是什么?我应该为此在我的应用程序中添加额外的逻辑吗?属性重命名后如何显示旧数据?
更新:
控制台中没有消息,应用程序停止使用更新UITextView
的代码行,它以绿色突出显示并带有错误消息:
Thread 1: EXC_BAD_ACCESS (code=1, address=0x0)
【问题讨论】:
崩溃时调试器日志输出什么?有什么例外? @Bek 我更新了问题。感谢您阅读。 【参考方案1】:我从头开始再次尝试,我没有重命名变量,而是创建了一个新变量。这次应用程序没有崩溃。很抱歉,这不是真正的答案,但它帮助我继续前进。
我学到的教训:
-
不要混淆 Xcode 检查器中的核心数据模型标识符和重命名 ID。有一个模型标识符(我将其留空)并为每个属性重命名 ID。
如果您使用 NSNumber 生成 Core Data 类,请不要尝试在控制台中像这样显示它们:
label.text = "number = \(object.number)"
这样做:
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 上:
-
我将版本从 2 更改为 3。我没有更改 Core Data 模型。
我更改了代码,修复了一些与 Core Data 无关的错误。
在模拟器中构建并运行项目。请注意,现在模拟器中的应用有数据版本 3。
更改了核心数据模型,建立在模拟器上。在这一步之后它崩溃了。
我做了什么来解决这个问题:
-
删除引入的变量。您可以按原样实时生成生成的课程。
将当前版本更改为以前的版本。就我而言,从 2 到 3。
运行应用并退出。
更改 Core Data 当前版本并添加新变量。
运行应用程序——它可以工作。
更新 2
我再次遇到了这个问题,我的回答没有帮助。不过,在我上面描述的一切之后。
我找到了this answer,这次终于解决了这个问题。秘诀是新属性不应该是可选的,它们应该有默认值。
【讨论】:
以上是关于轻量级核心数据迁移后崩溃的主要内容,如果未能解决你的问题,请参考以下文章