Swift 3更新核心数据模型会导致外部测试人员崩溃

时间:2017-08-02 22:42:24

标签: ios core-data swift3 core-data-migration

我发布了一个使用核心数据存储一些重要信息的应用。 最近,我决定重新制作我的数据模型,使其更新,并使其更易于使用。

我在数据模型中添加了一些实体,它在模拟器中运行良好 - 但是当我尝试对核心数据执行任何操作时,我将其发布给beta测试人员时会崩溃。

我没有创建新版本的数据模型。

我已阅读herehere关于如何处理此错误,但这两个答案都引用了我在我的应用中没有任何地方的代码,但它们似乎已内置 - 它们也会谈关于轻量级数据迁移? 很多答案都引用了NSPersistentStoreCoordinator,我没有/知道如何实现。

我在app委托中处理persistentContainer的代码是:

lazy var persistentContainer: NSPersistentContainer = {
    let container = NSPersistentContainer(name: "App_Name")
    container.loadPersistentStores(completionHandler: { (storeDescription, error) in
        if let error = error as NSError? {
            fatalError("Unresolved error \(error), \(error.userInfo)")
        }
    })
    return container
}()

其他答案也引用了模拟器中需要重新安装的崩溃 - 我认为我没有这些,但我可能没有注意到。

对我来说,更新数据模型的最佳方式是什么,这样我的用户才不会崩溃?

编辑:

我已将persistentContainer更新为:

lazy var persistentContainer: NSPersistentContainer = {
    let container = NSPersistentContainer(name: "App_Name")

    let myFileManager = FileManager()

    do {
        let docsurl = try myFileManager.url(for:.documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
        let myUrl = docsurl.appendingPathComponent("UserDataTA")

        if try myFileManager.contentsOfDirectory(atPath: docsurl.path).contains("UserDataTA") == false {
            try myFileManager.createDirectory(at: myUrl, withIntermediateDirectories: false, attributes: nil)

            try container.persistentStoreCoordinator.addPersistentStore(ofType: NSInMemoryStoreType, configurationName: nil, at: myUrl, options: nil)
        }
    } catch {
        print(error)
    }

    container.loadPersistentStores(completionHandler: { (storeDescription, error) in
        if let error = error as NSError? {
            fatalErrorText = error.debugDescription
            firstFuncs.errorAlert(error: fatalErrorText)
        }
    })
    return container
}()

但是现在错误消息是“Error Domain = NSCocoaErrorDomainCode = 134140'持久存储迁移失败,缺少映射模型。'”

1 个答案:

答案 0 :(得分:0)

您的崩溃听起来好像正在发生,因为您的数据模型已更改,并且设备上存在的任何现有数据无法按1:1映射到新模型。这就是数据映射和迁移的用武之地。Apple's docs are a good place to start.非常高级的概述是:

  1. 在Xcode中打开您的xcdatamodelxcdatamodeld文件,然后选择“添加模型版本...”。
  2. 如有必要,请将模型另存为xcdatamodeld文件。 (d后缀表示它已经过版本化。)
  3. 请注意,您的xcdatamodeld文件实际上是一个文件夹,它包含多个xcdatamodel文件。第一个版本之后的所有版本都将在文件名中包含数字版本号。
  4. 在新模型版本中更改模型。
  5. 如果更改相对简单(例如重命名实体或添加或删除属性),那么它被视为轻量级迁移,核心数据可以弄清楚如何进行迁移。< / LI>
  6. 如果更改涉及更改(例如将实体类型拆分为两个),则必须创建映射模型
  7. 添加代码以在启动时执行迁移。
  8. 显然这个过程还有很多,但这可能会给你一个不错的开始。