我发布了一个使用核心数据存储一些重要信息的应用。 最近,我决定重新制作我的数据模型,使其更新,并使其更易于使用。
我在数据模型中添加了一些实体,它在模拟器中运行良好 - 但是当我尝试对核心数据执行任何操作时,我将其发布给beta测试人员时会崩溃。
我没有创建新版本的数据模型。
我已阅读here和here关于如何处理此错误,但这两个答案都引用了我在我的应用中没有任何地方的代码,但它们似乎已内置 - 它们也会谈关于轻量级数据迁移? 很多答案都引用了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'持久存储迁移失败,缺少映射模型。'”
答案 0 :(得分:0)
您的崩溃听起来好像正在发生,因为您的数据模型已更改,并且设备上存在的任何现有数据无法按1:1映射到新模型。这就是数据映射和迁移的用武之地。Apple's docs are a good place to start.非常高级的概述是:
xcdatamodel
或xcdatamodeld
文件,然后选择“添加模型版本...”。xcdatamodeld
文件。 (d
后缀表示它已经过版本化。)xcdatamodeld
文件实际上是一个文件夹,它包含多个xcdatamodel
文件。第一个版本之后的所有版本都将在文件名中包含数字版本号。显然这个过程还有很多,但这可能会给你一个不错的开始。