我有一个旧的项目/应用同一捆绑ID以启动新鲜并导入代码。
除了核心数据外,XCode 9中的Swift 3.2现在在Swift 3.2中工作。访问核心数据时,任何运行旧版本的设备都会崩溃。
具体错误是在NSManageBjectModel的加载中。
旧的Swift 2方法:
我的Coredata文件称为:" myapp.xcdatamodeld"
lazy var managedObjectModel: NSManagedObjectModel = {
let modelURL = NSBundle.mainBundle().URLForResource("MyApp", withExtension: "momd")!
return NSManagedObjectModel(contentsOfURL: modelURL)!
}()
新的Swift 3方法:
我的新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文件中?
修复了问题。这与我的应用程序中NspersistentContainer的初始化方式有关。Swift 3锅炉板代码没有迁移到新数据存储,也没有寻找旧的SQLite DB(我怀疑这是未找到数据的主要原因)。
我的代码:
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
}()