当我删除相关对象时,为啥 Core Data 会复活已删除的对象?

Posted

技术标签:

【中文标题】当我删除相关对象时,为啥 Core Data 会复活已删除的对象?【英文标题】:Why does Core Data resurrect a deleted object when I delete a related object?当我删除相关对象时,为什么 Core Data 会复活已删除的对象? 【发布时间】:2012-05-12 02:56:30 【问题描述】:

假设我在 Core Data 中有一个 House 实体,它与许多 GraphicalAssets 相关联,它们是 House 的图片。

我想彻底清除所有房屋以及房屋本身的所有图形资源。对于两个方向,关系上的删除行为是 Nullify。删除东西的正确顺序似乎是先删除图形资产,然后是房屋。以下是发生的事情:

NSFetchRequest* fetchAllGraphicalAssets = [ [ NSFetchRequest alloc ] initWithEntityName:@"GraphicalAsset" ];
NSArray* allGraphicalAssets = [ self.managedObjectContext executeFetchRequest:fetchAllGraphicalAssets error:nil ];
for( GraphicalAsset* asset in allGraphicalAssets )
        [ self.managedObjectContext deleteObject:asset ];
[ self.managedObjectContext processPendingChanges ];

// At this point, if I execute fetchAllGraphicalAssets again, the count is 0. Perfect.

NSFetchRequest* housesRequest = [ NSFetchRequest fetchRequestWithEntityName:@"House"];
NSArray* existingHouses = [self.managedObjectContext executeFetchRequest: housesRequest error:nil]; 
    for( House* house in existingHouses )
        [ self.managedObjectContext deleteObject: house ];
[ self.managedObjectContext processPendingChanges ];

// Now, if I execute fetchAllGraphicalAssets again, the count is > 0. What is going on?

所以,看起来,因为房屋曾经指向图形资产(删除资产时应该取消的关系),所以当我删除房屋时,它神奇地复活了已删除的对象。为什么会这样?我什至尝试在删除任何一个对象之前,在两个方向上明确地消除房屋与其图形资产之间的关系,它仍然以这种方式运行。

【问题讨论】:

【参考方案1】:

HouseGraphic 的一对多关系的删除规则应该是级联的 - 这意味着删除House 会将删除级联到所有Graphic 对象

【讨论】:

如果我保留必须将现有关系设置为 nil 的代码,则更改为级联没有任何效果。这是有道理的。但它也没有任何效果,因为在我开始删除房屋时存在 0 个图形资产,所以应该没有什么可以级联。尽管如此,我删除了额外的语句,我确实得到了不同的行为。但是,当我最终保存管理对象上下文时,它会永远锁定我的处理器并且永远不会完成。这与我尝试在图形资产之前切换并删除房屋时遇到的行为相同。 我将接受这一点,因为它确实阻止了我所描述的行为的发生。尽管如此,它并没有解决我的问题(它根本不会保存),我最终不得不撕毁这段关系并做一些不同的事情来完成我所需要的。我认为从一开始就定义这种关系的方式有些奇怪。

以上是关于当我删除相关对象时,为啥 Core Data 会复活已删除的对象?的主要内容,如果未能解决你的问题,请参考以下文章

Core Data 对象删除使应用程序崩溃

在 Restkit 执行映射操作之前删除 Core data 中的现有对象

Core Data 在重新分配时删除对象

当我尝试在 .NET Core 中反序列化 FormFile 对象时,为啥会出现奇怪的异常?

从 Core Data 管理的表视图中删除对象时出错

从 Core Data 中删除对象和切换视图控制器时崩溃