swift - 防止升级用户时 CoreData 崩溃

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

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

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

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

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

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

最佳答案

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

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

  1. 确保您不以任何方式更改数据模型的原始版本。
  2. 在 Xcode 中,选择您的 xcdatamodel 文件,然后从菜单中选择编辑器 > 添加模型版本...
  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()
}

关于swift - 防止升级用户时 CoreData 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42091928/

相关文章:

ios - 列出(仅)文件夹中的子文件夹——Swift 3.0/iOS 10

swift - Xcode 卡在运行 Playground 上

ios - 如何在模拟器上运行的应用程序上将 lldb 作为独立调试器启动?

swift - 使用 Core Data 存储大型字典数组

ios - 如何按日期作为部分从核心数据中获取数据?

swift Linux。错误 : no such module 'Dispatch'

ios - 防止用户在 Swift 中离开网站

swift - 尝试使用关系理解和构建核心数据模型

swift - 横向 View Controller 应用程序委托(delegate)

iOS 8、Xcode 6 标签栏图像色调