Reputation: 49077
I have this code:
Store* store = [NSEntityDescription insertNewObjectForEntityForName:@"Store"];
store.name = @"My Company"
...
Now the store is managed in the context and will be saved when the context is saved, but I have a button where the user can cancel the form where data is collected. How do I undo or remove this from the context? Or am I thinking wrong?
Upvotes: 7
Views: 8565
Reputation: 1790
Undo
works only when I create a undoManager
(Swift 5):
managedObjectContext.undoManager = UndoManager()
After this configuration you can undo a last change:
managedObjectContext.undo()
Upvotes: 4
Reputation: 754
Also you could save all data from the user in an array and when the user is ready, you only have to save the array to core data.
Upvotes: 0
Reputation: 28409
As mentioned earlier, you can use an undo manager. Or, you could simply use a separate ManagedObjectContext, and do all your changes in there. If you decide to keep them, save the context. If not, simply discard it. A MOC is just a scratch pad for work, and has no impact on the underlying database until saved.
You can't really "detach an entity" but you can cause a managed object to turn back into a fault, losing any changes that have not been saved.
[managedObjectContext refreshObject:object mergeChanges:NO];
Snipped from the documentation...
If flag is NO, then object is turned into a fault and any pending changes are lost. The object remains a fault until it is accessed again, at which time its property values will be reloaded from the store or last cached state.
Upvotes: 8
Reputation: 125007
Core Data has built-in support for undo, so you can undo individual changes by sending the -undo
message to the context:
[store.managedObjectContext undo];
It also supports -redo
. You can undo all changes up to the most recent save using the -rollback
method:
[store.managedObjectContext rollback]
as indicated in @melsam's answer.
Upvotes: 12