2012-05-24 178 views
4

我有這樣的代碼:撤消核心數據管理對象

Store* store = [NSEntityDescription insertNewObjectForEntityForName:@"Store"]; 
store.name = @"My Company" 
... 

現在存儲在上下文的管理和當所述上下文被保存將被保存,但我有一個按鈕,用戶可以取消形式收集數據。我如何撤消或從上下文中刪除它?或者我想錯了?

回答

7

如前所述,您可以使用撤消管理器。或者,您可以簡單地使用單獨的ManagedObjectContext,並在其中進行所有更改。如果您決定保留它們,請保存上下文。如果不是,只需放棄它。 MOC只是工作的便箋本,在保存之前不會影響底層數據庫。

你不能真正「分離一個實體」,但是你可以導致一個被管理的對象回到故障狀態,失去所有未被保存的改變。

[managedObjectContext refreshObject:object mergeChanges:NO]; 

從文檔剪斷...

如果標誌爲否,則對象被變成了故障和任何未決 更改都將丟失。該對象保持故障,直到再次訪問 ,此時其屬性值將從 存儲或上次高速緩存的狀態重新加載。

6
[store.managedObjectContext rollback]; 
0

你也可以節省從用戶的所有數據在陣列中,並且當用戶準備好了,你只需要保存數組中的核心數據。

10

核心數據有built-in support for undo,這樣你就可以通過發送-undo消息上下文撤消個別更改:

[store.managedObjectContext undo]; 

它還支持-redo。您可以撤消所有更改到最近保存使用-rollback方法:

[store.managedObjectContext rollback] 

在@ melsam的答覆中指出。

+0

撤消和回滾有什麼區別?什麼是最常用的? – LuckyLuke

+1

@Dude前者反轉一個單一的變化,後者反轉*全部*變化直到前一次保存。你看過我鏈接的文檔嗎?它會有所幫助。還請閱讀[NSManagedObjectContext參考頁面](https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObjectContext_Class/NSManagedObjectContext.html)中的撤消方法。我剛剛意識到你的問題被標記爲[標籤:iOS],所以請注意文檔中的說明,說明您需要設置上下文的撤消管理器以啓用撤消支持。 – Caleb

+0

但是,如果您使用撤消,是否有可能在代碼中有一些其他地方將某些內容保存到上下文中,因此當您說撤銷時,您可能會撤消錯誤的更改? – LuckyLuke