CoreData保存/还原未保存的更改



我有一个UITableView中的对象列表,由NSFetchedResultsController管理。当用户选择一个对象时,会显示一个编辑视图,允许用户编辑所选的NSManagedObject实例。当用户进行更改时,对象的属性会在对象中更新。

问题是,像往常一样,有一个保存按钮和一个取消按钮。如果用户点击保存,则会保存NSManagedObjectContext,并反映更改。但是,如果用户点击cancel,我需要对象恢复到以前的状态。调用[managedObjectContext rollback]不适用于此目的。

有人知道如何正确实施吗?在编辑过程中,我不能将对象的属性存储为临时的独立ivar,因为有多个对象可以编辑,所有这些对象都有不同的属性。

更新

我目前正在做的是将NSManagedObject存储在一个实例变量中,并调用save:进行保存,调用rollback进行取消。实例变量使用object.property = something[object setValue:something forKey:@"property"]进行修改。这样就不会像预期的那样工作,而是产生这种行为:

  1. 如果编辑并保存,更改将按预期更新。但是,如果再次编辑并取消而不进行更改,则对象的状态将恢复为保存前的

  2. 如果编辑并取消,更改仍将更新,如同已保存一样。再次编辑和取消(不进行更改)将使其恢复到以前的状态。

此外:

这是否与我初始化用于填充表视图的NSFetchedResultsController的方式有关?代码:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSString *entityName = self.entityName;
NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:self.context];
[fetchRequest setEntity:entity];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[fetchRequest setIncludesPendingChanges:NO];
NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:_context sectionNameKeyPath:nil cacheName:@"Root"];
self.fetchedResultsController = theFetchedResultsController;
_fetchedResultsController.delegate = self;

Lookhttp://www.section42.de/coredata-how-to-revert-a-managed-object-to-its-original-state.这肯定会对你有所帮助。

您需要确保在托管对象上下文上设置了NSUndoManager实例,因为在iOS上默认为零。此处的相关解决方案:https://stackoverflow.com/a/2214982/318456

放弃了CoreData中的所有机制(它们都不起作用),我最终将对象的所有属性作为单独的变量存储在编辑视图控制器中,并在取消时回滚到它们。

我也遇到了同样的问题。发生这种情况是因为用户单击返回时textField正在修改过程中。若用户在点击之前在键盘上点击完成,那个么一切都很好。

我会将NSManagedObject存储为编辑视图控制器的属性。然后,您可以编辑它的所有属性,并在解除视图时保存或回滚。

最新更新