核心数据:重置为初始状态

时间:2010-02-06 19:08:43

标签: iphone iphone-sdk-3.0 core-data

我有一个对象,我对它进行了一些更改,但我不想保存它们,我想要'旧'值。

我试过了:

[managedObjectContext rollback];
[managedObjectContext redo];
[managedObjectContext reset];

并且它们似乎都不起作用......

NSLog(@"current: %@",ingredient.name); // ===> bread
[ingredient setName:@"test new data"];
NSLog(@"new: %@",ingredient.name); // ===> test new data

[managedObjectContext rollback];
[managedObjectContext redo];
[managedObjectContext reset];

NSLog(@"current: %@",ingredient.name); // ===> test new data

// I want again ===> bread

我应该再次重新获取对象吗?

感谢,

3 个答案:

答案 0 :(得分:24)

将更改换成NSUndoManager beginUndoGrouping,然后换取NSUndoManager endUndoGrouping后跟NSUndoManager undo

这是回滚更改的正确方法。 NSManagedObjectContext有自己的内部NSUndoManager,您可以访问。

更新显示示例

由于Cocoa Touch默认情况下NSUndoManager为零,您必须创建一个并将其设置为NSManagedObjectContext first

//Do this once per MOC
NSManagedObjectContext *moc = [self managedObjectContext];
NSUndoManager *undoManager = [[NSUndoManager alloc] init];
[moc setUndoManager:undoManager];
[undoManager release], undoManager = nil;

//Example of a grouped undo
undoManager = [moc undoManager];
NSManagedObject *test = [NSEntityDescription insertNewObjectForEntityForName:@"Parent" inManagedObjectContext:moc];
[undoManager beginUndoGrouping];
[test setValue:@"Test" forKey:@"name"];
NSLog(@"%s Name after set: %@", __PRETTY_FUNCTION__, [test valueForKey:@"name"]);
[undoManager endUndoGrouping];
[undoManager undo];
NSLog(@"%s Name after undo: %@", __PRETTY_FUNCTION__, [test valueForKey:@"name"]);

另外,请确保您的访问者遵守KVO规则并发布-willChange:-didChange:-willAccess:-DidAccess:通知。如果你只是使用@dynamic访问者,那么你会没事的。

答案 1 :(得分:4)

根据Apple的文档

使用

- (void)rollback; 
[managedObjectContext rollback];

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

Here

答案 2 :(得分:2)

在第二次[managedObjectContext refreshObject:ingredient mergeChanges:NO]来电之前尝试NSLog