gpt4 book ai didi

core-data - 核心数据删除对象: sets attributes to nil

转载 作者:行者123 更新时间:2023-12-02 22:46:40 24 4
gpt4 key购买 nike

我正在我的应用程序中实现撤消/重做机制。这对于很多情况都适用。但是,我无法撤消过去的deleteObject:。该对象已正确保存在撤消队列中,并且在调用撤消时我将其取回并重新插入到核心数据堆栈中。问题是,当我删除它时,它的所有属性都被设置为 nil。

我有一个实体“Canvas”,与“Graphic”实体之间存在名为“graphics”的一对多关系,该实体的逆设置为“canvas”。删除图形然后将其插入回去,不起作用。代码如下(重做方法基本相同):

- (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];
}

奇怪的是:

删除前:

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;
}),

您可以看到它是同一个对象,只是被核心数据完全漂白了。关系删除规则显然与此无关,因为我在测试中将它们设置为“无操作”。

最佳答案

嗯,我对修复并不满意,但一种方法是在删除对象之前在上下文上执行 [moc save]。不幸的是,在撤消/重做情况下,这意味着我必须在每次操作后保存,这是次优的,但解决了这个问题。

关于core-data - 核心数据删除对象: sets attributes to nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2968063/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com