CoreData:从NSManagedObjectContext清除更改

时间:2011-12-08 00:55:45

标签: objective-c ios core-data

我正在应用程序代理级别实例化NSManagedObjectContext对象,并在我的所有UIViewController中共享它。这是我用于在我的一个View Controllers中访问它的代码:

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

现在在这个屏幕上,我有一个UITableView,有9行&每个单元格都有一个UITextField。当用户将值输入到文本字段中时,我将它们分配到modelObj。现在,我的用户可以选择取消并放弃所有更改或将其保存到磁盘。我有保存代码正常工作。但是在用户试图放弃更改的情况下,我不知道该怎么做。似乎没有[managedObjectContext discardChanges]方法将它们全部丢弃。

我可以想出几种方法来解决这个问题。

  • 为每个控制器创建一个NSManagedObjectContext的新实例,而不是在整个应用程序中共享一个实例。
  • 或者,我可以在我的代码中创建一堆NSString并在其中保存用户值,并仅在用户点击保存时调用insertNewObjectForEntityForName:

哪种方式合适?或者有没有办法让NSManagedObjectConext丢弃对它做出的所有更改?

谢谢,
的Teja。

3 个答案:

答案 0 :(得分:39)

NSManagedObjectContext有一个简单的方法:

[managedObjectContext rollback];

此方法“从撤消堆栈中删除所有内容,放弃所有插入和删除,并将更新的对象恢复为其上次提交的值。” (documentation

除非我遗漏了某些东西,否则它应该能为您提供所需的一切。

答案 1 :(得分:2)

您可能正在寻找-refreshObject:mergeChanges: - 文档说它会从持久性存储中重置一个对象,如果您将NO作为第二个参数传递,则可以选择不重新应用具有已经完成了。

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

答案 2 :(得分:0)

雨燕5

managedObjectContext.rollback()