CoreData保存/恢复未保存的更改

时间:2012-02-29 05:17:01

标签: iphone objective-c ios ipad core-data

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

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

有谁知道如何正确实现这个?我无法在编辑过程中将对象的属性存储为临时单独的ivars,因为有多个对象可以编辑,所有对象都具有不同的属性。

更新

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

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

  2. 如果您编辑并取消,更改仍会更新,就像保存一样。再次编辑和取消(不做更改)会将其恢复到以前的状态。

  3. 同时

    这与我初始化用于填充表格视图的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;
    

5 个答案:

答案 0 :(得分:5)

答案 1 :(得分:3)

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

答案 2 :(得分:2)

放弃了CoreData中所有这些机制(没有一个工作),我最终将对象的所有属性存储为编辑视图控制器中的单独变量,然后回滚他们取消了。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

我有同样的问题。发生这种情况是因为当用户单击返回时textField处于修改过程中。如果用户在单击返回键之前先在键盘上单击完成,则一切正常。