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



我有一个旧的项目/应用同一捆绑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
}()

最新更新