2012-08-03 56 views
1

我在我的項目中使用核心數據,我要用戶填寫的表格保存到核心數據DB。用戶重新啓動應用後,保存的表單列表應顯示在TableView中。但是,如果用戶在Core Data提交更改之前退出應用程序,則表單不會被保存。有什麼辦法來捕捉我的數據被提交的時刻嗎?核心數據提交通知

這是我如何保存表單:

if (![document.managedObjectContext save: &error]) { 
    NSLog(@"DB saving error!"); 
} 
else { 
    NSLog(@"DB save OK!"); 
    //show alertView 
} 

我試圖跟蹤核心數據使用-com.apple.CoreData.SQLDebug 1提交的時刻。日誌顯示它在約15秒後開始保存對象。

// This is how my log output looks like 
2012-08-03 14:50:43.587 iPadAF_new[4506:707] DB save OK! 
2012-08-03 14:50:58.628 iPadAF_new[4506:2597] CoreData: sql: COMMIT 

那麼我怎麼才能得到提交後的通知或東西,所以用戶將無法退出應用程序,直到保存?

+0

它似乎並不像你對我應該知道什麼時候提交發生。在保存發生之前系統是否會殺死你的應用程序,或者你是從Xcode中殺死它? – 2012-08-03 12:14:37

+0

比方說用戶決定立即終止該應用後,他/她看到了有關全成警報保存 – NikGreen 2012-08-03 12:19:43

+0

坦率地說,你不知道你有一個問題 - 你只是擔心你可能有一個。我可以建議您在真實手機上運行測試用例,按照您的說法執行操作 - 按住主界面按鈕並儘快終止應用程序 - 然後查看重新啓動數據時是否缺失。我懷疑它會正常工作 - 當「保存」成功返回時,蘋果將確保數據實際上已被保存。如果它不是一個嚴重的Apple錯誤。另外,你是否真的認爲用戶會放棄所有的應用程序?也許開發人員做的只是「普通」用戶不這麼做(他們可能會切換到不同的應用程序)。 – 2012-08-03 13:23:29

回答

2

您可以從您的上下文中註冊NSManagedObjectContextDidSaveNotification以瞭解上下文已保存的時間,或者您可以觀察屬性hasChanges的KVO通知。我懷疑這些會爲後臺工作,所以他們可能無法解決你的問題。

0

作爲核心數據模板,說明你應該保存上下文在你的AppDelegate

- (void)applicationWillTerminate:(UIApplication *)application 
{ 
    // Saves changes in the application's managed object context before the application   terminates. 
    [self saveContext]; 
} 

- (void)saveContext 
{ 
    NSError *error = nil; 
    NSManagedObjectContext *managedObjectContext = self.managedObjectContext; 
    if (managedObjectContext != nil) { 
     if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) { 
      // Replace this implementation with code to handle the error appropriately. 
      // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
      NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
      abort(); 
     } 
    } 
} 

對我來說也節省了上下文

- (void)applicationDidEnterBackground:(UIApplication *)application 

解決了這個問題。

0

我認爲提交是當底層SQL數據庫提交寫的內容提前登錄到主文件,但預寫日誌保存在一個單獨的持久性文件,因此它應該是安全的從數據庫的時刻保存。

如果你檢查,你會看到每個核心數據存儲3個文件容器(至少在某些時候)。

Foo.sqlite - 主數據庫 Foo.sqlite-shm - 共享內存/緩存文件,一次性的。 Foo.sqlite-wal - 預寫日誌。如果存在且非空,則包含尚未寫入主數據庫的最新更改,但如果查詢需要,仍會從其中返回結果。

這意味着你不應該需要通知的提交的數據已經安全在該點之前,只是沒有合併到主文件。