【问题标题】:Coredata: Backup and Restore a database fileCoredata:备份和恢复数据库文件
【发布时间】:2015-10-14 12:31:47
【问题描述】:

我已经搜索并没有找到太多关于创建备份和恢复数据库文件的信息,所以我希望比我更聪明的人可以为我指明正确的方向。

这是在 OSX 上。

我成功创建了备份,恢复是主要问题。但是我快到了,我已经成功恢复了数据库文件,但我需要重新启动应用程序才能正常工作。

恢复方法:

 [_managedObjectContext reset];
 NSPersistentStore *currentStore = self.persistentStoreCoordinator.persistentStores.lastObject;
 [_persistentStoreCoordinator removePersistentStore:currentStore error:&error];
 NSFileManager *filemanager;
 filemanager = [NSFileManager defaultManager];
 if ([filemanager fileExistsAtPath:[url path]]) {
    //If the file exist, remove file  
    if ([filemanager removeItemAtURL:url error:&error]) {}
 }
 [_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:urlbackup options:nil error:&error];
 currentStore = self.persistentStoreCoordinator.persistentStores.lastObject;

 [_persistentStoreCoordinator migratePersistentStore:currentStore toURL:url options:options withType:NSSQLiteStoreType error:&error];

一切正常,如果我重新启动应用程序。如何在不重新启动应用程序的情况下使其工作?看来我需要重新加载所有数据并刷新视图。

我尝试了以下方法但没有成功:

 [arrayController rearrangeObjects];
 [tableView reloadData];

再次,如果我重新启动应用程序一切正常,备份文件将恢复。任何指针将不胜感激。

【问题讨论】:

  • @littleDrummerBoy:你有什么解决办法吗?我也有同样的情况。
  • @Bucket : 很抱歉评论晚了,最近经常出差。有没有办法在这里发私信?如果您仍需要帮助,请告诉我。

标签: objective-c cocoa core-data


【解决方案1】:

您希望将创建 Core Data 堆栈的代码放在可重用的地方,这意味着如果它当前所在的位置,则不在应用委托中。您还应该销毁视图,或者至少销毁对任何当前存在的托管对象、上下文等的视图控制器引用。

现在,一旦完成,上下文的所有者可以销毁它、持久存储和模型,然后重新运行堆栈创建代码。之后,您可以重新创建您的视图(或将新的上下文/托管对象传递给 VC)。

这只是重新组织您的代码,使其可重用,并确保您不会留下任何对无效对象的旧引用。

【讨论】:

  • 谢谢,我明白你在说什么,但可能需要一点时间来实施。在这个项目中,我使用 XCodes 模板并决定将所有 coredata 内容留在应用程序委托中。其余代码在主控制器中,我目前也没有单独的 VC。看起来需要重新编码,以便按照您的建议重新排列。
  • 这就是我所需要的 - 谢谢。将核心数据堆栈移至我的主控制器。在恢复方法中,销毁堆栈,用备份替换文件,重新创建堆栈并重新建立到上下文的链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多