恢复核心数据
Restore Core Data
我已经成功地使用以下代码创建了 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")
}
}
这似乎有效。备份文件已创建。这个答案:
建议我需要取消分配我的 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 实现了我想要的结果,但这似乎让我的控制台非常生气。我想正确地做到这一点,没有任何警告。
很难确定,但可能的原因是
loadPersistentStores
是一个异步操作,这就是为什么它有一个完成块
您正在尝试在调用该方法后立即恢复,而不是等待它完成。
您可能需要将恢复代码移到 loadPersistentStores
使用的完成块中,以便您可以确定加载已完成。
我已经成功地使用以下代码创建了 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")
}
}
这似乎有效。备份文件已创建。这个答案:
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 实现了我想要的结果,但这似乎让我的控制台非常生气。我想正确地做到这一点,没有任何警告。
很难确定,但可能的原因是
loadPersistentStores
是一个异步操作,这就是为什么它有一个完成块您正在尝试在调用该方法后立即恢复,而不是等待它完成。
您可能需要将恢复代码移到 loadPersistentStores
使用的完成块中,以便您可以确定加载已完成。