Переместить CoreStore SQLiteStore в другое место - PullRequest
0 голосов
/ 07 января 2019

В моем приложении, использующем CoreStore 5.3, я пытаюсь переместить локальное хранилище sqlite в другое место, чтобы получить доступ к базе данных из расширения приложения. Хотя перемещение файлов с использованием FileManager.default.moveItem (at: oldURL, to: newURL) для текущих 3 файлов (MyApp.sqlite, MyApp.sqlite-wal и MyApp.sqlite-shm) работает нормально, я просто не думаю, что это так хорошая идея сделать это ...

if FileManager.default.fileExists(atPath: oldFileURL.path) {
    do {
        try FileManager.default.moveItem(at: oldFileURL, to: newFileURL)
        try FileManager.default.moveItem(at: oldJournalingURL, to: journalingURL)
        try FileManager.default.moveItem(at: oldSharedMemoryURL, to: sharedMemoryURL)
    } catch let error {
        // error handling ...
    }
}

Я знаю, что в NSPersistentStoreCoordinator есть функциональные возможности для migratePersistentStore (https://developer.apple.com/documentation/coredata/nspersistentstorecoordinator/1468927-migratepersistentstore)

Таким образом, вы обычно делаете это, например:

if let persistentStore = persistentStoreCoordinator.persistentStores.first {
    do {
        try persistentStoreCoordinator.migratePersistentStore(persistentStore, to: newFileURL, options: nil, withType: NSSQLiteStoreType)
    } catch {
        print("error")
    }
}

... так как это также перемещает все связанные файлы.

Однако, по-видимому, этот метод не доступен в CoreStore. Так как persistentStoreCoordinator является внутренним свойством DataStack, единственный способ получить к нему доступ - через unsafeContext (), после того, как dataStack уже настроен, но это вызовет больше проблем, потому что тогда контекст пытается сделать do save () , который не будет работать, поскольку постоянное хранилище было перемещено.

Есть ли другой способ сделать это с CoreStore?

1 Ответ

0 голосов
/ 09 января 2019

Вы правы, что в настоящее время нет способа сделать это из CoreStore. Частично причина в том, что на самом деле нет способа сделать это безопасно. CoreStore не может знать, что ни один из упомянутых файлов не используется где-либо еще, прежде чем перемещать их.

Для хранилищ SQLite перемещение трех упомянутых вами файлов, вероятно, будет самой простой реализацией. Если вы используете «Внешнее хранилище» для двоичных атрибутов, вам также необходимо переместить папку с именем .<sqlitename>_SUPPORT. Поэтому, если ваш sqlite-файл называется mydata.sqlite, эта папка будет называться .mydata_SUPPORT.

Мой совет - создать специальную папку для вашего магазина и поместить туда только файлы, связанные с SQLite. Поэтому в следующий раз, когда вы захотите переместить каталоги, вам нужно переместить только саму папку.

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