我已设法使用以下代码创建PersistentStore的本地备份:
func backup(){
let backUpFolderUrl = FileManager.default.urls(for: .documentDirectory, in:.userDomainMask).first!
let backupUrl = backUpFolderUrl.appendingPathComponent("backup")
let container = NSPersistentContainer(name: "MyApp")
container.loadPersistentStores(completionHandler: { (storeDescription, error) in })
let store:NSPersistentStore
store = container.persistentStoreCoordinator.persistentStores.last!
do {
try container.persistentStoreCoordinator.migratePersistentStore(store,
to: backupUrl,
options: nil,
withType: NSSQLiteStoreType)
} catch {
print("Failed to migrate")
}
}
这似乎有效。备份文件已创建。这个答案: Backup core data locally, and restore from backup - Swift 建议我需要释放我的NSPersistentContainer,然后使用replacePersistentStore(at:destinationOptions:withPersistentStoreFrom:sourceOptions:ofType :)来恢复我的备份。所以我试着这样:
func restoreFromStore(){
let storeFolderUrl = FileManager.default.urls(for: .applicationSupportDirectory, in:.userDomainMask).first!
let storeUrl = storeFolderUrl.appendingPathComponent("MyApp")
let backUpFolderUrl = FileManager.default.urls(for: .documentDirectory, in:.userDomainMask).first!
let backupUrl = backUpFolderUrl.appendingPathComponent("backup")
let container = NSPersistentContainer(name: "MyApp")
container.loadPersistentStores(completionHandler: { (storeDescription, error) in })
let stores = container.persistentStoreCoordinator.persistentStores
for store in stores {
do {
try container.deall
} catch {
print("Couldnt clear store")
}
}
do{
try
container.persistentStoreCoordinator.replacePersistentStore(at: storeUrl,
destinationOptions: nil,
withPersistentStoreFrom: backupUrl,
sourceOptions: nil,
ofType: NSSQLiteStoreType)
} catch {
print("Failed to restore")
}
}
这似乎没有做任何事情。我没有收到任何错误或警告,但它似乎也没有在我备份它的时候恢复我的核心数据。
抱歉,我知道这可能是糟糕的代码。我实际上完成了我想要完全使用FileManager的结果,但它似乎让我的控制台真的很生气。我想在没有任何警告的情况下正确地做到这一点。
答案 0 :(得分:2)
很难确定,但可能的原因是
loadPersistentStores
是一个异步操作,这就是为什么它有一个完成块
您正在尝试在调用该方法后立即恢复,而不是等待它完成。
您可能需要在loadPersistentStores
使用的完成块内移动恢复代码,以便确保加载完成。