2015-10-14 67 views
0

我已经搜查,并没有发现太多有关创建备份和还原数据库文件,所以我希望有人比我聪明可以点我在正确的方向。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]; 

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

+0

@ littleDrummerBoy:你有没有得到任何解决方案?我有同样的情况。 – Bucket

+1

@Bucket:对于迟到的评论,最近一直在旅游很多。有没有办法在这里发送私人信息?让我知道你是否仍然需要帮助。 – littleDrummerBoy

回答

0

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

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

这只是重新组织代码,因此它是可重用的并确保您不会将任何旧引用保留为无效对象。

+0

谢谢,我明白你在说什么,但可能需要一点时间才能实施。在这个项目中,我使用XCodes模板,并决定将所有coredata的东西留在应用程序委托中。其余代码位于主控制器中,而且我目前没有单独的VC。看起来像一些重新编码,以便按照您的建议重新排列。 – littleDrummerBoy

+0

这就是我需要的 - 谢谢。将核心数据堆栈移到我的主控制器。在还原方法中,销毁堆栈,用备份替换文件,重新创建堆栈和重新建立到上下文的链接。 – littleDrummerBoy

相关问题