防止CoreData崩溃以升级用户

时间:2017-02-07 14:07:08

标签: swift xcode core-data swift3 core-data-migration

我在大约一年半前建立了一个应用程序,我要回来了。这是我削减Swift牙齿的项目,从那以后,无论是语言还是我的Swift能力,显然已经发生了很多变化。

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

为避免这种情况,您需要确保按照以下步骤操作:

  1. 确保不以任何方式更改数据模型的原始版本。
  2. 在Xcode中,选择您的xcdatamodel文件,然后从菜单中选择Editor>添加模型版本......
  3. Xcode将根据当前模型建议新版本名称。记下新版本名称,然后单击“完成”。
  4. 再次选择xcdatamodel文件,转到文件检查器,然后在“模型版本”下,选择新版本名称,使其成为当前版本。
  5. 在Project Navigator中,选择新版本的xcdatamodel。添加您的属性。
  6. 按此顺序执行这些步骤非常重要。如果在创建新模型之前添加属性或将其设置为当前版本,则会发生崩溃。

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

    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()
    }
    

答案 1 :(得分:0)

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

对于 Xcode 12.3

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

enter image description here

使用绿色复选标记添加将新模型标记为当前模型 按照下图

enter image description here