恢复核心数据

时间:2018-02-13 22:40:38

标签: 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 = 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的结果,但它似乎让我的控制台真的很生气。我想在没有任何警告的情况下正确地做到这一点。

1 个答案:

答案 0 :(得分:2)

很难确定,但可能的原因是

  • loadPersistentStores是一个异步操作,这就是为什么它有一个完成块

  • 您正在尝试在调用该方法后立即恢复,而不是等待它完成。

您可能需要在loadPersistentStores使用的完成块内移动恢复代码,以便确保加载完成。