防止升级用户的 CoreData 崩溃

Posted

技术标签:

【中文标题】防止升级用户的 CoreData 崩溃【英文标题】:Preventing a CoreData crash for upgrading users 【发布时间】:2017-02-07 14:07:07 【问题描述】:

我大约一年半前开发了一个应用程序,现在我又要回来了。那是我开始使用 Swift 的项目,从那时起显然发生了很多变化,无论是语言还是我的 Swift 能力。

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

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

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

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

【问题讨论】:

您可以选择如何从旧版本迁移到新版本,我建议您在这里阅读一下:developer.apple.com/library/content/documentation/Cocoa/… 谢谢,看看 崩溃不是开发过程的一部分。你需要在发布之前修复它。 @TomHarrington,明白了。我已经让它在本地工作,但它需要我从我的模拟器中删除应用程序并进行另一个构建和运行。同样,当我把它放在我的手机上时,我必须这样做,删除我所有的旧核心数据并重新开始。用户显然无法接受,所以我需要使用旧模式构建和运行,创建一些数据,使用新模式构建和运行并确保迁移发生 【参考方案1】:

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

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

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

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

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

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

【讨论】:

谢谢迈克。另外,我需要为 NSManagedObject 生成子类吗?是不是这里漏掉了? 这非常有效。为稍后找到此内容的用户添加编辑 再次感谢迈克的帮助! 假设您已经有一个实体的 NSManagedObject 子类,我认为最简单的方法是手动将新属性添加到类中:@NSManaged var myNewAttribute: String? 是的。我不知道当你进行必要的生成时是否发生了一些 xcodeproj 魔法【参考方案2】:

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

对于 Xcode 12.3

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

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

【讨论】:

以上是关于防止升级用户的 CoreData 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

iOS CoreData 版本升级和数据库迁移

应用程序在 Nsdata 持久存储调用上崩溃

我无法重现的用户可能会导致 CoreData 崩溃

Coredata 迁移崩溃

我的应用程序有啥更好的选择 - CoreData 或 plist? [关闭]

认识CoreData—初识CoreData