2015-10-14 105 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

相關問題