ios - 恢复核心数据

标签 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 实现了我想要的结果,但这似乎让我的控制台非常生气。我想正确地做到这一点,没有任何警告。

最佳答案

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

  • loadPersistentStores 是一个异步操作,这就是它有一个完成 block 的原因

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

您可能需要将恢复代码移到 loadPersistentStores 使用的完成 block 中,以便您可以确定加载已完成。

关于ios - 恢复核心数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48776874/

相关文章:

ios - 无法将类型 'Option' 的值转换为预期的参数类型 '@noescape (Option) throws -> Bool'

string - Swift - 从核心数据中获取字符串并以 UTF8 格式转换

ios - 为什么我的 UI 按钮在经过一定时间后停止响应?

android - 在 phonegap 内调用和监控电话

swift - 对字符串进行排序以确定它是 Swift Xcode 中的 Anagram 还是 Palindrome

swift - 确定字符串是否包含 Swift 集合中的字符的最佳方法是什么

objective-c - 核心数据 NSArrayController 不保存或撤消编程元素

ios - 使用 performBlock 进行计数请求时核心数据崩溃

ios - Geofire/火力基地.indexOn

iphone - 在 UICollectionView 中更改菜单的标签标题