核心数据deleteObject:将属性设置为零
问题描述:
我在我的应用程序中实现了撤销/重做机制。这适用于很多情况。但是,我无法撤消过去的deleteObject :.该对象被正确保存在撤销队列中,并且在调用撤消时我可以很好地将其恢复到核心数据堆栈中。问题是,当我删除它时,它的所有属性都设置为零。核心数据deleteObject:将属性设置为零
我有一个实体“画布”与一个“图形”一对多关系的“图形”实体,它的反设为“画布”。删除图形,然后插回,不起作用。下面的代码(重做方法基本相同):
- (void)deleteGraphic:(id)aGraphic {
//NSLog(@"undo drawing");
//Prepare the undo/redo
[self.undoManager beginUndoGrouping];
[self.undoManager setActionName:@"Delete Graphic"];
[[self.detailItem valueForKey:@"graphics"] removeObject:aGraphic];
[[self managedObjectContext] deleteObject:aGraphic];
//End undo/redo
[self.undoManager registerUndoWithTarget:self selector:@selector(insertGraphic:) object:aGraphic];
[self.undoManager endUndoGrouping];
NSLog(@"graphics are %@", [self sortedGraphics]);
//Update drawing
[self.quartzView setNeedsDisplay];
}
和这里的wierdness:
之前将其删除:
重做graphics are (
<NSManagedObject: 0x1cc3f0> (entity: Graphic; id: 0x1c05f0 <x-coredata:///Graphic/t840FE8AD-F2E7-4214-822F-7994FF93D4754> ; data: {
canvas = 0x162b70 <x-coredata://A919979E-75AD-474D-9561-E0E8F3388718/Canvas/p20>;
content = <62706c69 73743030 d4010203 04050609 0a582476 65727369 6f6e5424 746f7059 24617263 68697665 7258246f 626a6563 7473>;
frameRect = nil;
label = nil;
order = 1;
path = "(...not nil..)";
traits = "(...not nil..)";
type = Path;
})
后:
graphics are (
<NSManagedObject: 0x1cc3f0> (entity: Graphic; id: 0x1c05f0 <x-coredata:///Graphic/t840FE8AD-F2E7-4214-822F-7994FF93D4754> ; data: {
canvas = nil;
content = nil;
frameRect = nil;
label = nil;
order = 0;
path = nil;
traits = nil;
type = nil;
}),
你可以看到它是同一个对象,只是被Core Data完全褪色了。删除轮询的关系显然与它无关,因为我在测试中将它们设置为“无操作”。
答
嗯,我对修复不满意,但一种方法是在删除对象之前在上下文中执行[moc保存]。不幸的是,在撤销/重做情况下,这意味着我必须在每次操作后进行保存,这是次优的,但可以解决此问题。
很好的答案!我花了无数小时试图调试相反的情况:我想撤消一个我插入的对象,并且它回来了。在插入对象之前保存上下文保存了问题。奇怪,但有效。 – 2012-07-27 02:28:43