将CoreStore SQLiteStore移到另一个位置

时间:2019-01-07 16:00:00

标签: ios swift corestore

在使用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的内部属性一样,访问它的唯一方法是在已经设置了DataStack之后通过unsafeContext()进行操作,但这会造成更多的麻烦,因为上下文随后尝试执行save() ,因为永久性存储已被移走,因此无法使用。

CoreStore还有其他方法吗?

1 个答案:

答案 0 :(得分:1)

您是正确的,CoreStore当前无法执行此操作。部分原因是实际上没有办法安全地执行此操作。在移动它们之前,CoreStore无法知道所提到的文件没有在其他任何地方使用。

对于SQLite存储,移动您提到的3个文件可能是最简单的实现。如果对二进制属性使用“外部存储”,则还需要移动名为.<sqlitename>_SUPPORT的文件夹。因此,如果您的sqlite文件命名为mydata.sqlite,则此文件夹将命名为.mydata_SUPPORT

我的建议是为您的商店创建一个专用文件夹,并仅在其中放置与SQLite相关的文件。因此,下次您将要移动目录时,只需要移动文件夹本身即可。