撤消核心数据托管对象

Posted

技术标签:

【中文标题】撤消核心数据托管对象【英文标题】:Undo core data managed object 【发布时间】:2012-05-24 20:46:30 【问题描述】:

我有这个代码:

Store* store = [NSEntityDescription insertNewObjectForEntityForName:@"Store"];
store.name = @"My Company"
...

现在商店是在上下文中管理的,并且会在保存上下文时保存,但是我有一个按钮,用户可以在其中取消收集数据的表单。如何从上下文中撤消或删除它?还是我想错了?

【问题讨论】:

【参考方案1】:

Core Data 具有built-in support for undo,因此您可以通过将-undo 消息发送到上下文来撤消单个更改:

[store.managedObjectContext undo];

它还支持-redo。您可以使用-rollback 方法撤消直到最近保存的所有更改:

[store.managedObjectContext rollback]

如@melsam 的回答所示。

【讨论】:

撤消和回滚有什么区别?最常用的是什么? @Dude 前者反转单个更改,后者反转 所有 更改直到上一次保存。您是否查看了我链接的文档?它会有所帮助。另请阅读NSManagedObjectContext reference page 中的撤消方法。我刚刚意识到您的问题被标记为ios,因此请注意文档中的说明,即您需要设置上下文的撤消管理器以启用撤消支持。 但是如果你使用 undo,是否有可能代码中的其他地方可能会将某些内容保存到上下文中,所以当你说 undo 时,你可能会撤消错误的更改? 当你有一个实体的引用时,有没有简单的方法可以从上下文中分离它? @Dude 你当然可以删除对象。但是,托管对象仅在托管对象上下文中才有意义,因此您不能“分离”它并仍然拥有可用的对象。【参考方案2】:

如前所述,您可以使用撤消管理器。或者,您可以简单地使用单独的 ManagedObjectContext,并在其中进行所有更改。如果您决定保留它们,请保存上下文。如果没有,只需丢弃它。 MOC 只是工作的便签本,在保存之前对底层数据库没有影响。

您不能真正“分离实体”,但可以导致托管对象变回故障,丢失任何尚未保存的更改。

[managedObjectContext refreshObject:object mergeChanges:NO];

从文档中截取...

如果 flag 为 NO,则对象将变为故障并且任何未决 更改丢失。对象在被访问之前一直是故障 再次,此时它的属性值将从 存储或上次缓存状态。

【讨论】:

【参考方案3】:
[store.managedObjectContext rollback];

【讨论】:

【参考方案4】:

Undo 仅在我创建 undoManager(Swift 5) 时有效:

managedObjectContext.undoManager = UndoManager()

完成此配置后,您可以撤消最后一次更改:

managedObjectContext.undo()

【讨论】:

【参考方案5】:

您还可以将用户的所有数据保存在一个数组中,当用户准备好时,您只需将该数组保存到核心数据中。

【讨论】:

以上是关于撤消核心数据托管对象的主要内容,如果未能解决你的问题,请参考以下文章

在运行循环的旋转中使用核心数据撤消组

如何识别核心数据托管对象模型——哈希?

更新当前的 CoreData 条目

如何在核心数据中将非托管对象更改为托管对象

核心数据托管对象集

核心数据:托管对象和实体之间的区别?