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

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 beginUndoGroupingNSUndoManager 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]

【讨论】:

以上是关于核心数据:重置为初始状态的主要内容,如果未能解决你的问题,请参考以下文章

Vue中重置data的数据为初始状态

在每个页面上将状态重置为初始状态

将复选框重置为初始状态

WPF如何重置Combobox下拉菜单里的值为初始状态

将表单域重置为初始状态

将页面重置为初始状态 qml