В моем приложении, использующем 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?