【问题标题】:Restore Core Data恢复核心数据
【发布时间】:2018-02-13 22:40:37
【问题描述】:

我已经成功地使用以下代码创建了我的 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 实现了我想要的结果,但这似乎让我的控制台非常生气。我想正确地做到这一点,没有任何警告。

【问题讨论】:

  • 具体是什么不起作用?
  • @TomHarrington 感谢您的回复。它只是不会恢复我原来的核心数据堆栈。例如。我创建了一些核心数据。运行备份。然后更改数据。运行还原。它什么也没做。没有错误。但也不会恢复到进行更改之前。备份似乎正在工作。文件在备份目录中创建。
  • 嗨,试试你的代码进行备份和恢复。我没有收到任何错误,但我怎样才能找到我的实体?谢谢
  • 如果可能的话,请您添加您的最终工作代码。

标签: ios swift core-data nspersistentstore


【解决方案1】:

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

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

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

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

【讨论】:

  • 再来一次!你完全正确。分别完成上述步骤,效果很好。它只需要一些完成处理程序!再次感谢。
  • 我想我遇到了同样的问题。你能在这里发布你的最终代码吗,这样我就可以检查我的了。谢谢。
猜你喜欢
  • 1970-01-01
  • 2014-01-09
  • 1970-01-01
  • 2013-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
相关资源
最近更新 更多