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

mon*_*eta 12 iphone core-data iphone-sdk-3.0

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

我尝试过:

[managedObjectContext rollback];
[managedObjectContext redo];
[managedObjectContext reset];
Run Code Online (Sandbox Code Playgroud)

并且它们似乎都没有工作......

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
Run Code Online (Sandbox Code Playgroud)

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

谢谢,

Mar*_*rra 24

将您的更改换入a NSUndoManager beginUndoGrouping然后a,NSUndoManager endUndoGrouping然后按a NSUndoManager undo.

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

更新显示示例

因为NSUndoManager在Cocoa Touch上默认为nil,所以你必须创建一个并将其设置为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"]);
Run Code Online (Sandbox Code Playgroud)

另外,还要确保你的存取跟随志愿和公布的规则-willChange:,-didChange:,-willAccess:-DidAccess:通知.如果你只是使用@dynamic访问器,那么你会没事的.