2011-03-05 27 views
6

如果在執行 - [NSManagedObjectContext save:]時發生錯誤,那麼恢復到現有持久性存儲的適當策略是什麼?如何在保存managedObjectContext時處理錯誤?

- [NSManagedObjectContext rollback]?

或者,我應該在試圖保存之前在文件系統上保存商店副本:然後,如果出現錯誤,請使用 - [NSPersistentStoreCoordinator setURL:forPersistentStore:]將商店設置爲保存的商店?

感謝您的指點。

貢薩洛

回答

10

當保存失敗時,您(作爲程序員)做錯了什麼。

我寫了一些非常複雜的核心數據應用程序,並且從未在生產中看到失敗的保存。

確保用戶可以輸入的值可以保存而不會出錯。

這意味着如果您有非可選關係,請不要接受「完成」按鈕,直到用戶爲此關係選擇一個實體爲止。或者設置一個默認關係實體。
如果您需要一個特殊格式的NSString,在接受它之前驗證該字符串。

這對用戶來說也更方便。如果你告訴他10 minutes ago you did something wrong, thats why I will delete all your changes,他會認爲WTF?。如果你告訴他他The value you try to enter is not in the correct format. Please use xxxxx他會認爲Ok, let's change it.

現在,當你確定保存從未失敗後,你可以把[context rollback]放在裏面,因爲你永遠不應該說永遠不會。
但在你這樣做之前,你應該問用戶他是否想給你發送錯誤日誌。因爲保存不應該失敗。

0

我相信,雖然我沒有看到它做在該文檔中明確寫入,如果發生錯誤,然後保存在保存失敗和數據存儲將保持不變。您可以通過複製數據存儲,強制某種錯誤,然後將存儲與副本進行比較來輕鬆驗證此情況。

0

NSManagedContext保存返回一個BOOL,如果成功則返回,否則返回NO。這將確保數據存儲庫實際上是否已更改。

另一件事: 看看蘋果的「核心數據編程指南:持久性商店功能」,在「配置SQLite商店的保存行爲」下。他們給出了一個完整的示例,說明如何爲商店設置完全同步選項,以確保在保存過程中由於某些中斷而導致數據損壞。

相關問題