核心数据:重置为初始状态
Posted
技术标签:
【中文标题】核心数据:重置为初始状态【英文标题】:Core Data: Reset to the initial state 【发布时间】:2010-02-06 19:08:43 【问题描述】:我有一个对象,我对其进行了一些更改,但我不想保存它们,我想要“旧”值。
我试过了:
[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
我应该重新获取对象吗?
谢谢,
r.
【问题讨论】:
是的,请参阅 Marcus S.Zarra 接受的答案 【参考方案1】:将您的更改封装在 NSUndoManager beginUndoGrouping
和 NSUndoManager endUndoGrouping
中,然后是 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"]);
还要确保您的访问者遵守 KVO 规则并发布 -willChange:
、-didChange:
、-willAccess:
和 -DidAccess:
通知。如果你只是使用@dynamic
访问器,那么你会没事的。
【讨论】:
它不符合你的建议,确定我做错了什么...... undoManager = [[NSUndoManager alloc] init]; [undoManager beginUndoGrouping]; NSLog(@"current: %@",ingredient.name); [成分集合名称:@“测试新数据”]; NSLog(@"new: %@",ingredient.name); [undoManager endUndoGrouping]; [undoManager 撤消]; NSLog(@"current: %@",ingredient.name);谢谢,r。 另外,使用 NSManagedObjectModel 成分中的 NSUndo 仍然无法正常工作......谢谢,r. 好的,谢谢!关键是:[[ingredient managedObjectContext] setUndoManager:undoManager]; 不是强迫症,但你应该自动释放撤消管理器。 不一定。取决于您在 UIManagedDocument 之上的配置方式。例如,如果您有一个子 MOC,那么您可以控制该子 MOC 的保存。如果您严格使用 UIManagedDocument 内部的 MOC,那么是的,这是有风险的。【参考方案2】:根据 Apple 的文档
使用
- (void)rollback;
[managedObjectContext rollback];
从撤消堆栈中删除所有内容,丢弃所有插入和删除,并将更新的对象恢复为其最后提交的值。
Here
【讨论】:
【参考方案3】:在第二次调用NSLog
之前尝试[managedObjectContext refreshObject:ingredient mergeChanges:NO]
。
【讨论】:
以上是关于核心数据:重置为初始状态的主要内容,如果未能解决你的问题,请参考以下文章