Coredata:备份和还原数据库文件
我已经搜查,并没有发现太多有关创建备份和还原数据库文件,所以我希望有人比我聪明可以点我在正确的方向。Coredata:备份和还原数据库文件
这是在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];
这一切的作品,IF我重新启动应用程序。如何在不重新启动应用程序的情况下使其工作?看来我需要重新加载所有数据并刷新视图。
我已经试过以下后没有成功:
[arrayController rearrangeObjects];
[tableView reloadData];
再次,如果我重新启动应用程序一切正常时,备份文件还原。任何指针将不胜感激。
您希望将创建Core Data堆栈的代码放置在可重用的位置,这意味着不在应用程序委托中(如果它现在是它的位置)。您还应该销毁视图,或者至少视图控制器引用任何当前存在的托管对象,上下文等。
现在,一旦完成,上下文的所有者就可以销毁它,持久存储和模型,然后重新运行堆栈创建代码。之后,您可以重新创建视图(或将新的上下文/管理对象传递给VC)。
这只是重新组织代码,因此它是可重用的并确保您不会将任何旧引用保留为无效对象。
谢谢,我明白你在说什么,但可能需要一点时间才能实施。在这个项目中,我使用XCodes模板,并决定将所有coredata的东西留在应用程序委托中。其余代码位于主控制器中,而且我目前没有单独的VC。看起来像一些重新编码,以便按照您的建议重新排列。 – littleDrummerBoy
这就是我需要的 - 谢谢。将核心数据堆栈移到我的主控制器。在还原方法中,销毁堆栈,用备份替换文件,重新创建堆栈和重新建立到上下文的链接。 – littleDrummerBoy
@ littleDrummerBoy:你有没有得到任何解决方案?我有同样的情况。 – Bucket
@Bucket:对于迟到的评论,最近一直在旅游很多。有没有办法在这里发送私人信息?让我知道你是否仍然需要帮助。 – littleDrummerBoy