Swift 为升级用户防止CoreData崩溃

Swift 为升级用户防止CoreData崩溃,swift,xcode,core-data,swift3,core-data-migration,Swift,Xcode,Core Data,Swift3,Core Data Migration,我大约在一年半前创建了一个应用程序,现在我将回到这个应用程序中。这是一个我刻苦钻研的项目,从那以后,我的语言和敏捷能力都发生了很大的变化 昨天,我第一次更新了我的单CoreData模型,添加了可选的字符串属性。我执行了文件生成位,并确保在inspector列中正确选择了新的数据模型 在我的模拟器和测试设备上,我需要删除旧版本的应用程序来安装新版本,否则我会崩溃。我假设这只是开发环境过程的一部分我如何确保升级用户在从应用商店进行简单更新时不必删除和重新安装?我假设Xcode/CoreData/Ap

我大约在一年半前创建了一个应用程序,现在我将回到这个应用程序中。这是一个我刻苦钻研的项目,从那以后,我的语言和敏捷能力都发生了很大的变化

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

在我的模拟器和测试设备上,我需要删除旧版本的应用程序来安装新版本,否则我会崩溃。我假设这只是开发环境过程的一部分我如何确保升级用户在从应用商店进行简单更新时不必删除和重新安装?我假设Xcode/CoreData/Apple使用一些用户看不见的内部脚本或流程来处理这一问题,“它可以正常工作。”但我想在这里发布这篇文章,以了解我是否还需要做些什么来确保用户从v1顺利过渡到v1.1

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


任何想法都将受到欢迎和赞赏。谢谢

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

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

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

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

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

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

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

    对于Xcode 12.3

    从主菜单
    Editor->Add Model Version

    要添加,请使用绿色复选标记将新模型标记为当前模型 按照下图进行操作


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

    对于Xcode 12.3

    从主菜单
    Editor->Add Model Version

    要添加,请使用绿色复选标记将新模型标记为当前模型 按照下图进行操作



    关于如何从旧版本迁移到新版本,您有一些选择,我建议您在这里读一读:谢谢,请注意崩溃不是开发过程的一部分。你需要在发布前修复它。@TomHarrington,明白了。我已经让它在本地工作,但它需要我从模拟器中删除应用程序,然后再进行另一次构建和运行。同样,当我把它放在手机上,删除所有旧的coredata并重新开始时,我也必须这样做。显然,用户无法接受,因此我需要使用旧模式构建和运行,创建一些数据,使用新模式构建和运行,并确保迁移发生。对于如何从旧版本迁移到新版本,您有一些选择,我建议在这里读一读:谢谢,我们会注意到崩溃不是开发过程的一部分。你需要在发布前修复它。@TomHarrington,明白了。我已经让它在本地工作,但它需要我从模拟器中删除应用程序,然后再进行另一次构建和运行。同样,当我把它放在手机上,删除所有旧的coredata并重新开始时,我也必须这样做。显然用户无法接受,因此我需要使用旧模式构建和运行,创建一些数据,使用新模式构建和运行,并确保迁移发生。另外,我是否需要为NSManagedObject生成子类?这不在这里吗?这很有效。为以后找到此内容的用户添加编辑再次感谢您的帮助Mike!假设您已经为实体创建了NSManagedObject的子类,我认为最简单的方法是手动将新属性添加到类中:
    @NSManaged var myNewAttribute:String?
    True。我不知道当你做必要的那一代时,是否有一些xcodeproj魔法发生了谢谢