2011-12-08 24 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作为第二个参数,则可以选择不重新应用所做的更改。

这可能会要求您存储一组已更改的对象(对于第一个参数),然后在将上下文中的更改提交到商店时清除该设置。不过,这应该是一个相当微不足道的补充。

相关问题