Получение Swift 4.2 для загрузки Core Data Store из предыдущей сборки Objective-C - PullRequest
1 голос
/ 12 марта 2019

Итак, у меня есть старое ObjC Core Data App, которое я переписываю с нуля в Swift 4.2, но я не могу получить PersistentContainer из Swift, чтобы найти NSManagedObjectModel из ObjC. Приложение уже находится в 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)

... но все равно не работает. Я все еще не могу найти и перенести старый магазин. Я не могу поверить, что я единственный человек, который испытал это, но для моей жизни не могу найти какие-либо предложения по переполнению стека, которые работают. Мысли кто-нибудь?

Я пробовал

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
    }()

Но старая модель магазина все еще не загружается.

1 Ответ

0 голосов
/ 20 марта 2019

Для тех с подобными проблемами обновления, много проб и ошибок, кажется, предоставили ответ. Вот как я обнаружил старый магазин в Swifts new 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]

Спасибо всем этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...