繁体   English   中英

获取Swift 4.2以从以前的Objective-C构建中加载Core Data Store

[英]Getting Swift 4.2 to load Core Data Store from previous Objective-C build

因此,我有一个较旧的ObjC核心数据应用程序,该应用程序将在Swift 4.2中从头开始重写,但无法从Swift的PersistentContainer中找到ObjC的NSManagedObjectModel。 该应用程序已经在AppStore中,因此我显然需要我的新Swift版本来加载用户设备上已经存在的当前商店。

当我打印出原始ObjC模型的目录时,它显示给我:

/Users/xxxx/Library/Developer/CoreSimulator/Devices/2DB3B49C-E397-427E-A30C-273C2738B253/data/Containers/Data/Application/7B1BCD4F-91F8-45AD-9634-4F1D71205EEB/Documents/Model.sqlite

...但是当我在Swift重写中执行相同操作时,它显示了我:

/Users/xxxx/Library/Developer/CoreSimulator/Devices/2DB3B49C-E397-427E-A30C-273C2738B253/data/Containers/Data/Application/AB13D4B1-01E2-477D-B6D1-295F4AD0F1BB/Documents/Model.sqlite

“文档”目录之前的最后一个数字字符串非常不同。

由于商店不在同一个目录中,因此我的Swift重写只会创建一个全新的商店,然后从那里开始。 有趣的是,如果我在模拟器中将旧的ObjC版本“备份”到Swift重写上,它仍然会加载原始存储,因此显然在两个不同的目录中有2个完全不同的存储。

如何获得当前的Swift重写以加载旧商店? Swift 4.2现在正在使用PersistentContainer,我认为我可以使用以下方法来获取原始商店:

let dirPaths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)

...但是它仍然不起作用。 我仍然无法找到并迁移旧商店。 我不敢相信我是唯一经历过这种情况的人,但是在我的生命中找不到任何可行的stackoverflow建议。 有人在想吗?

我试过了

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

        let storeDirectory = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first!
        let url = storeDirectory.appendingPathComponent("Model.sqlite")
        let description = NSPersistentStoreDescription(url: url)
        description.shouldInferMappingModelAutomatically = true
        description.shouldMigrateStoreAutomatically = true
        container.persistentStoreDescriptions = [description]

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

        return container
    }()

但是它仍然没有加载旧的商店模型。

对于那些具有类似更新问题的用户,似乎已经尝试了很多反复尝试。 这是我在Swifts新的persistentContainer中定位旧商店的方式:

let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
let filePath = paths[0].appendingPathComponent("Model.sqlite")
let description = NSPersistentStoreDescription(url: filePath)
description.shouldMigrateStoreAutomatically = true
description.shouldInferMappingModelAutomatically = true
container.persistentStoreDescriptions = [description]

谢谢所有那些。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM