Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 恢复核心数据_Ios_Swift_Core Data_Nspersistentstore - Fatal编程技术网

Ios 恢复核心数据

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

我已使用以下代码创建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(位于: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
使用的完成块中,以便确保加载已完成

汤姆哈林顿感谢您的回复。它只是不能恢复我原来的核心数据堆栈。例如我创建了一些核心数据。运行备份。然后更改数据。运行恢复。它没有任何作用。没有错误。但也不会恢复到进行更改之前的状态。备份似乎正在工作。文件是在备份目录中创建的。您好,请尝试您的代码进行备份和还原。我没有得到任何错误,但我如何才能找到我的实体?谢谢如果可能的话,请您添加您的最终工作代码。再次!你完全正确。分别运行上述步骤,效果良好。它只是需要一些完成处理程序在那里!再次感谢。我想我也有同样的问题。你能把你的最终代码贴在这里吗,这样我就可以检查我的了。谢谢