防止升级用户的 CoreData 崩溃

Zac*_*iro 1 xcode core-data core-data-migration swift swift3

大约一年半前,我构建了一个应用程序,我将再次使用它。这是我开始学习 Swift 的项目,很明显,从那时起,语言和我的 Swift 能力都发生了很大变化。

昨天,我第一次更新了我的单个 CoreData 模型以添加一个可选的字符串属性。我做了文件生成位并确保在检查器列中正确选择了新的数据模型。

在我的模拟器和测试设备上,我需要删除旧版本的应用程序才能安装新版本,否则我会崩溃。我认为这只是开发环境过程的一部分。如何确保升级用户在从 App Store 进行简单更新时不必删除和重新安装?我假设 Xcode/CoreData/Apple 已经通过一些用户不可见的内部脚本或进程来处理这个问题,“它只是有效。” 但我想在此处发布此内容,以了解是否需要做任何其他事情来确保用户从 v1 平滑过渡到 v1.1。

正如我所提到的,我所做的只是一个可选的字符串列。我假设所有现有的用户数据都将迁移到新模式,新字段为nil.

这里的任何想法都将受到欢迎和赞赏。谢谢!

Mik*_*rne 7

如果您的应用程序在升级时在模拟器中崩溃,您的用户也会崩溃。

为避免这种情况,您需要确保遵循以下步骤:

  1. 确保不要以任何方式更改数据模型的原始版本。
  2. 在 Xcode 中,选择您的 xcdatamodel 文件,然后从菜单中选择 Editor > Add Model Version...
  3. Xcode 将根据当前型号建议一个新版本名称。记下新版本名称,然后单击“完成”。
  4. 再次选择 xcdatamodel 文件,转到文件检查器,然后在模型版本下,选择新版本名称以使其成为当前版本。
  5. 在 Project Navigator 中,选择 xcdatamodel 的新版本。添加您的属性。

按此顺序执行这些步骤很重要。如果在创建新模型或将其设为当前版本之前添加属性,则会发生崩溃。

编辑:这仅在您启用轻量级迁移时才有效。这是如何执行此操作的代码片段:

let options = [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true]

do {
    //coordinator is an NSPersistentStoreCoordinator
    try coordinator!.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: options
} catch var error as NSError {

  // handle error however you want here...            
  abort()
}
Run Code Online (Sandbox Code Playgroud)