2010-07-30 48 views
5

我正在爲我的應用程序開發備份/恢復系統,其中用戶可以下載核心數據存儲庫(sqlite文件)的備份版本並替換當前使用的數據存儲與下載的文件。但是,一旦用戶下載文件並替換當前的數據存儲,則沒有任何數據看起來已經更新。但是,當應用程序退出&重新啓動時,恢復的數據可用。我如何強制我的應用程序重新加載核心數據存儲的文件?在應用程序運行時替換核心數據sqlite文件,數據不會更新

我試圖從我的UIViewController其恢復數據,像這樣訪問應用程序的委託,以重建核心數據堆棧和導航堆棧傳播完成它在所有視圖控制器:

MyAppDelegate *app = [[UIApplication sharedApplication] delegate]; 
app.managedObjectContext = nil; 
app.persistentStoreCoordinator = nil; 
app.managedObjectModel = nil; 
managedObjectContext = [app managedObjectContext]; 

NSArray *controllers = [self.navigationController viewControllers]; 
UIViewController *c; 
for (int i = 0; i < [controllers count]; i++) { 
    c = [controllers objectAtIndex:i]; 
    [c setManagedObjectContext:managedObjectContext]; 
} 

但這不工作,只當我回到根視圖控制器引發以下錯誤:'The NSManagedObject with ID:0x5d79060 <x-coredata://D8E73D64-C9BA-4CFA-9213-F8BD61749155/MyObject/p2> has been invalidated.'

有誰知道如何強制應用程序重新加載數據,並開始與新的數據存儲文件的工作?

回答

1

我覺得什麼絆倒您的事實是,即使你可以設置你所有的管理對象上下文,存儲協調員等來nil,你還是要完全重建使用的每一種管理對象基於這些對象。

最好的辦法是做你現在正在做的事情,同時找到一種方法來銷燬你使用過的每一個核心數據對象。也許你可以將你的各種視圖控制器放到根目錄下並從頭開始重新加載該控制器,以便它使用新的核心數據堆棧?您將失去一定的用戶友好性(因爲他們必須使用已加載的新數據重新構建視圖控制器堆棧),但是您一定會摧毀您需要的所有內容。

+0

感謝您的回答。這很好。你知道在這種情況下如何處理版本控制嗎?我試過用舊版本替換sqlite文件,它給了我一個「無法找到源存儲模型」的錯誤。 – 2011-10-01 23:20:44

+0

您需要明確版本的模型文件。 Xcode有工具可以做到這一點 - 尋找添加模型版本到現有的'xcdatamodel'的選項。 – Tim 2011-10-02 00:43:21