【发布时间】:2018-07-02 10:34:09
【问题描述】:
我正在尝试制作当前 Core Data 数据库文件的副本。
经过一些研究,我发现migratePersistentStore(_:to:options:withType:) 在这种情况下可能有用,正如Apple documentation 所说,
此方法通常用于“另存为”操作。
虽然文档也说,
重要
调用此方法后,指定的存储将从协调器中删除,因此存储不再是有用的引用。
因此,我尝试保留原始商店引用,以便应用可以继续工作。
受到this thread的启发,我跟随Tom Harrington的想法:
- 创建一个新的 migrate-only
NSPersistentStoreCoordinator并添加您原来的持久性存储文件。- 使用这个新的 PSC 迁移到新的文件 URL。
- 删除对这个新 PSC 的所有引用,不要将其用于其他任何事情。
这是我的代码,用于使用 UIActivityViewController 共享备份 sqlite 文件:
func shareDatabase() {
let backupFileName = "Backup.sqlite"
let backupFilePath = URL(fileURLWithPath: NSHomeDirectory()).appendingPathComponent("Library").appendingPathComponent("Application Support").appendingPathComponent(backupFileName)
let mainDataPSC = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.persistentStoreCoordinator
let migratePSC = NSPersistentStoreCoordinator(managedObjectModel: mainDataPSC.managedObjectModel)
let origStore = mainDataPSC.persistentStores.first!
try! migratePSC.migratePersistentStore(origStore, to: backupFilePath, options: [NSSQLitePragmasOption: ["journal_mode": "DELETE"]], withType: NSSQLiteStoreType)
let activityVC = UIActivityViewController(activityItems: [backupFilePath], applicationActivities: nil)
present(activityVC, animated: true, completion: nil)
}
很遗憾,迁移后它仍然失去对原始商店的引用,并且应用程序无法正常运行。
这是复制 sqlite 文件的正确方法吗? 如何保留原始参考资料?
谢谢大家!
【问题讨论】:
标签: ios swift sqlite core-data