我有一个与Department具有多对一关系的托管对象Employee。因此,一个员工可以在一个部门,但部门可以包含多个员工。
我使用撤消管理器来注册删除某些Employee。之后我关闭撤消注册我删除了部门。部门删除会删除所有剩余的员工,因为它上面设置了Cascade Delete
规则。
NSManagedObjectContext *defaultContext = [NSManagedObjectContext MR_defaultContext];
NSUndoManager *undoManager = [defaultContext undoManager];
[undoManager enableUndoRegistration];
[undoManager setActionName:@"Delete"];
[employee MR_deleteEntityInContext:defaultContext];
// let undo manager finish registering events on current run loop
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate date]];
[undoManager disableUndoRegistration];
// ...
// somewhere later without undo manager enabled
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
Department *department = [departmentOnMainThread MR_inContext:localContext];
[department MR_deleteEntityInContext:localContext];
}];
然后我撤消删除在我的上下文中与Department一起复活的Employee。
NSManagedObjectContext *defaultContext = [NSManagedObjectContext MR_defaultContext];
NSUndoManager *undoManager = [defaultContext undoManager];
[undoManager enableUndoRegistration];
[undoManager undo];
[defaultContext MR_saveToPersistentStoreAndWait];
// let undo manager finish registering events on current run loop
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate date]];
[undoManager disableUndoRegistration];
有趣的是,当我运行撤消时,我的上下文的[defaultContext deletedObjects]
包含我最初使用NSUndoManager
捕获的部门,员工以及可能已与部门一起删除的其他员工但该更改未被删除在删除原始员工时实际上已经捕获了。此其他员工将所有字段设置为nil。
出于好奇,我打电话给[defaultContext refreshAllObjects]
回复:
CoreData:警告:NSManagedObjectContext委托覆盖错误 处理行为以静默方式删除具有ID的对象 “0xd000000000280000 '和 将nil / 0替换为所有属性值而不是抛出。
问题是,可能应该真正删除其他员工,但是如何恢复原来的员工和部门,这两者显然应该被放回数据库?
NSUndoManager
将它们恢复为已删除的对象,这些对象毫无意义。