我有这个代码:
Store* store = [NSEntityDescription insertNewObjectForEntityForName:@"Store"];
store.name = @"My Company"
...
现在商店是在上下文中管理的,并且会在保存上下文时保存,但是我有一个按钮,用户可以在其中取消收集数据的表单。如何从上下文中撤消或删除它?还是我想错了?
我有这个代码:
Store* store = [NSEntityDescription insertNewObjectForEntityForName:@"Store"];
store.name = @"My Company"
...
现在商店是在上下文中管理的,并且会在保存上下文时保存,但是我有一个按钮,用户可以在其中取消收集数据的表单。如何从上下文中撤消或删除它?还是我想错了?
Core Data内置了对 undo 的支持-undo
,因此您可以通过将消息发送到上下文来撤消单个更改:
[store.managedObjectContext undo];
它还支持-redo
. 您可以使用以下方法撤消直到最近保存的所有更改-rollback
:
[store.managedObjectContext rollback]
如@melsam 的回答所示。
如前所述,您可以使用撤消管理器。或者,您可以简单地使用单独的 ManagedObjectContext,并在其中进行所有更改。如果您决定保留它们,请保存上下文。如果没有,只需丢弃它。MOC 只是工作的便签本,在保存之前对底层数据库没有影响。
您不能真正“分离实体”,但可以导致托管对象变回故障,丢失任何尚未保存的更改。
[managedObjectContext refreshObject:object mergeChanges:NO];
从文档中截取...
如果 flag 为 NO,则对象将变为故障,并且任何未决更改都将丢失。该对象在再次访问之前一直是错误的,此时它的属性值将从存储或上次缓存状态重新加载。
[store.managedObjectContext rollback];
Undo
仅在我创建undoManager
(Swift 5)时才有效:
managedObjectContext.undoManager = UndoManager()
完成此配置后,您可以撤消最后一次更改:
managedObjectContext.undo()
您还可以将用户的所有数据保存在一个数组中,当用户准备好时,您只需将数组保存到核心数据。