我正在尝试制作当前Core Data数据库文件的副本。
在做了一些研究之后,我发现migratePersistentStore(_:to:options:withType:)
可能在这种情况下很有用,正如Apple documentation所说,
此方法通常用于“另存为”操作。
虽然文件也说,
重要
调用此方法后,将从协调器中删除指定的存储,因此存储不再是有用的引用。
因此,我尝试保留原始商店参考,以便应用可以继续工作。
受到this thread的启发,我遵循了Tom Harrington的想法:
- 创建新的仅迁移
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)
}
不幸的是,迁移后它仍然失去对原始商店的引用,之后app无法正常工作。
这是制作sqlite文件副本的正确方法吗? 我如何保留原始参考文献?
谢谢大家!
答案 0 :(得分:0)
你在其他答案中没有做我的意思,但公平地说,我可能没有像我应该的那样清楚地解释它。您遇到此问题是因为您仍然正在迁移origStore
,因此它仍然会被删除,但仍然无效。使用新协调器是不够的 - 您必须确保单独保留现有的Core Data堆栈。
对该过程的更全面的描述是:
NSPersistentStoreCoordinator
- 您已经在做的事。migratePSC
将持久性商店文件添加到协调员(您的addPersistentStore(ofType:configurationName:at:options:)
)。此函数返回NSPersistentStore
对象。migratePSC
)将新的持久性存储从步骤2迁移到新位置(backupFilePath
)。在此之后,步骤2中的持久性商店将无效,但您并未在其他任何地方使用它,因此无关紧要。同时,您现有的NSPersistentContainer
及其所有属性都不会受到影响,您的应用仍可继续使用。