2011-12-08 28 views
10

我在應用程序委託級別實例化一個NSManagedObjectContext對象,並在我所有的UIViewController之間共享它。下面是我用來訪問它在我的視圖控制器之一代碼:CoreData:從NSManagedObjectContext中清除更改

 NSManagedObjectContext *managedObjectContext = appDelegate.managedObjectContext; 
     modelObj = (Model *) [NSEntityDescription insertNewObjectForEntityForName:@"Model" inManagedObjectContext:[appDelegate managedObjectContext]]; 

現在,在這個屏幕上,我有一個UITableView 9行&每個單元都有一個UITextField。當用戶輸入文本字段的值時,我將它們分配到modelObj。現在,我的用戶可以選擇取消並放棄所有更改或將其保存到磁盤。我有保存代碼工作正常。但在用戶試圖放棄更改的情況下,我不知道該怎麼做。似乎沒有一種方法可以將它們全部扔掉。

我可以想到解決這個問題的幾種方法。

  • 爲每個控制器創建一個新的NSManagedObjectContext實例,而不是在整個應用程序中共享一個實例。
  • 或者,我可以在我的代碼中創建一堆NSString s並將用戶值保存在其中,並且僅當用戶單擊保存時才調用insertNewObjectForEntityForName:

哪種方法是正確的?或者是否有辦法讓NSManagedObjectConext放棄對它所做的所有更改?

謝謝,
Teja。

+1

Tim Dean的回答是正確的。但是在這個編輯屏幕上創建一個子上下文也不會是一個錯誤的方法,在那裏插入新的對象,並且只有在用戶確認時纔將其保存到父上下文中。否則,把孩子扔掉,你就完成了。 –

回答

36

的NSManagedObjectContext有一個簡便的方法:

[managedObjectContext rollback]; 

這種方法「消除一切從撤消堆棧,丟棄所有的插入和刪除,並恢復更新的對象,以他們的最後提交的數值。」 (documentation

除非我失去了一些東西,那應該會給你你需要的一切。

+2

由於該問題是用iOS標記的,因此提及回滾方法要求將一個'undoManager'分配給MOC是有用的,對於iOS我相信這不是默認情況,所以'rollback'會執行沒有。 –

+1

以下是支持@ ChristopherKing的評論的參考文獻[apple docs](https://developer.apple.com/library/ios/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObjectContext_Class/#//apple_ref/occ/instp/NSManagedObjectContext/UndoManager的)。一定要爲你的NSManagedObjectContext添加一個'NSUndoManager'來支持'撤銷'或'回滾'操作。 –

2

您可能正在尋找-refreshObject:mergeChanges: - 文檔說它將重置持久性存儲中的對象,並且如果您通過NO作爲第二個參數,則可以選擇不重新應用所做的更改。

這可能會要求您存儲一組已更改的對象(對於第一個參數),然後在將上下文中的更改提交到商店時清除該設置。不過,這應該是一個相當微不足道的補充。

相關問題