gpt4 book ai didi

ios - Xcode 9 中的 Swift 2 到 Swift 3 核心数据 - 如何移植已保存的现有核心数据 "data"?

转载 作者:行者123 更新时间:2023-11-30 12:08:53 24 4
gpt4 key购买 nike

我有一个较旧的项目/应用程序,我想将其从 Swift 2 升级到 3.x 版本的 Swift。在移植代码的过程中,我使用相同的包 ID 重新创建了一个新项目以重新开始导入代码。

现在,除了 Core Data 之外,Xcode 9 中的 Swift 3.2 一切正常。任何运行旧版本应用程序的设备在访问核心数据时都会崩溃。

具体错误发生在加载 NSManagedObjectModel 时。

旧 SWIFT 2 WAY:

我的 CoreData 文件名为:“MyApp.xcdatamodeld”

lazy var managedObjectModel: NSManagedObjectModel = {
let modelURL = NSBundle.mainBundle().URLForResource("MyApp", withExtension: "momd")!
return NSManagedObjectModel(contentsOfURL: modelURL)!
}()

新的 SWIFT 3 WAY:

我的新 CoreData 文件名为:“MyApp.xcdatamodel”

lazy var managedObjectModel: NSManagedObjectModel = {
if let modelURL = Bundle.main.url(forResource: "MyApp", withExtension: "xcdatamodel") {
return NSManagedObjectModel(contentsOf: modelURL)!
} else {
let modelURLOld = Bundle.main.url(forResource: "MyApp", withExtension: "momd")
return NSManagedObjectModel(contentsOf: modelURLOld!)!
}
}

当我运行代码时,出现以下错误:

CoreData: annotation:  Failed to load optimized model at path '/var/containers/Bundle/Application/50367482-FC2C-4553-B04B-68AD922B8128/MyApp.app/MyApp.momd/MyApp.omo'

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'NSFetchRequest could not locate an NSEntityDescription for entity name 'UMyAppModel''

所以我的新应用程序代码找不到要为 CoreData 加载的文件。

如何将这些较旧的 CoreData 文件加载到我的应用程序中?如果需要,我可以设置迁移,但问题是我看不到旧的核心数据文件。

让应用程序运行的一种方法是添加以下代码:

  let objectModel = NSManagedObjectModel.mergedModel(from: [Bundle.main])
return objectModel!

但是,以前的历史数据都没有加载到应用程序中。

如何迁移或访问原始 Coredata 数据,以迁移到具有旧代码版本 (swift 2) 应用程序的设备上的新 Coredata 文件?

最佳答案

已解决问题。这与我的应用程序中初始化 NSPercientContainer 的方式有关。 swift 3 样板代码没有迁移到新的数据存储,也没有寻找旧的 sqlite 数据库(我怀疑这最终是找不到数据的主要原因)。

我的代码:

lazy var persistentContainer: NSPersistentContainer = {
let modelURL = Bundle.main.url(forResource: "MyApp", withExtension: "momd")!
let container = NSPersistentContainer(name: "MyApp", managedObjectModel: NSManagedObjectModel(contentsOf: modelURL)!)

let documentsDirectory = FileManager.default.urls(for: FileManager.SearchPathDirectory.documentDirectory, in: FileManager.SearchPathDomainMask.userDomainMask)
let storeUrl = self.applicationDocumentsDirectory.appendingPathComponent("MyApp.sqlite")
let description = NSPersistentStoreDescription()

description.shouldInferMappingModelAutomatically = true
description.shouldMigrateStoreAutomatically = true

container.persistentStoreDescriptions = [description]
container.persistentStoreDescriptions = [NSPersistentStoreDescription(url: storeUrl)]

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

关于ios - Xcode 9 中的 Swift 2 到 Swift 3 核心数据 - 如何移植已保存的现有核心数据 "data"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46324781/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com