防止升级用户时 CoreData 崩溃

Preventing a CoreData crash for upgrading users

大约一年半前我开发了一个应用程序,现在我又回来了。这是我切入 Swift 牙齿的项目,从那时起显然在语言和我的 Swift 能力方面发生了很多变化。

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

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

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

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

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

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

  1. 确保您没有以任何方式更改数据模型的原始版本。
  2. 在 Xcode、select 您的 xcdatamodel 文件中,然后从菜单中选择编辑器 > 添加模型版本...
  3. Xcode 将根据当前型号建议一个新版本名称。记下新版本名称,然后单击“完成”。
  4. 再次
  5. Select xcdatamodel 文件,转到文件检查器并在模型版本下,select 新版本名称使其成为当前版本。
  6. 在 Project Navigator 中,select 新版本的 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()
}

除了@Mike Taverne 的回答,我认为如果我 post 一些屏幕截图来说明该选项会更好

对于Xcode 12.3

从主菜单中选择Editor -> Add Model Version

要添加,请使用绿色复选标记将新模型标记为当前模型 关注下图