恢复核心数据

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 使用的完成块中,以便您可以确定加载已完成。