Ios 恢复核心数据
我已使用以下代码创建PersistentStore的本地备份:Ios 恢复核心数据,ios,swift,core-data,nspersistentstore,Ios,Swift,Core Data,Nspersistentstore,我已使用以下代码创建PersistentStore的本地备份: func backup(){ let backUpFolderUrl = FileManager.default.urls(for: .documentDirectory, in:.userDomainMask).first! let backupUrl = backUpFolderUrl.appendingPathComponent("backup") let container = NSPersisten
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(位于:destinationOptions:withPersistentStoreFrom:sourceOptions:Of Type:)还原备份。所以我试着这样:
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
使用的完成块中,以便确保加载已完成 汤姆哈林顿感谢您的回复。它只是不能恢复我原来的核心数据堆栈。例如我创建了一些核心数据。运行备份。然后更改数据。运行恢复。它没有任何作用。没有错误。但也不会恢复到进行更改之前的状态。备份似乎正在工作。文件是在备份目录中创建的。您好,请尝试您的代码进行备份和还原。我没有得到任何错误,但我如何才能找到我的实体?谢谢如果可能的话,请您添加您的最终工作代码。再次!你完全正确。分别运行上述步骤,效果良好。它只是需要一些完成处理程序在那里!再次感谢。我想我也有同样的问题。你能把你的最终代码贴在这里吗,这样我就可以检查我的了。谢谢