【问题标题】: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?

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

【问题讨论】:

    标签: objective-c ios core-data ios5


    【解决方案1】:

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

    【讨论】:

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