iPhone核心数据:跨多对一关系的级联删除

Dav*_*ine 21 iphone cocoa cocoa-touch core-data cascading-deletes

我有两个A和B类,从A到B有多对一的关系(多个A对象可以引用相同的B).问题是,如果A侧的删除规则是Cascade,则仅在删除最后一个引用A 时才删除B,或者在第一次删除关联的A 时删除B. 如果重要的话,关系B侧的删除规则是Nullify.

另外,我在核心数据文档中读到,在某些情况下,Optional标志很重要.但目前尚不清楚他们所说的关系与我的案例有何关系.他们在讨论收容案(B由A拥有),而我的案例是订阅/关联(B与A有关).

我可以简单地在代码中管理删除programmaticaly,但是如果可能的话,我希望允许Core Data做正确的事情.但目前尚不清楚Core Data中是否支持我正在寻找的垃圾收集语义.

有什么建议?

Luk*_*kas 15

我的目标与你的目标相同(删除最后一次引用的A后删除B).为了做到这一点,我花了比预期更长的时间.特别是因为

  • 当时一个准备进行删除,在一对多的关系乙可能尚未更新,所以你不能只是算一个中引用乙.
  • isDeleted on A似乎已经设置了-prepareForDeletion

如果有人感兴趣的话,这对我有用(我会使用Department < - >> Employee,因为它更容易阅读):

在员工中:

- (void)prepareForDeletion {
    // Delete our department if we we're the last employee associated with it.
    Department *department = self.department;
    if (department && (department.isDeleted == NO)) {
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"isDeleted == NO"];
        NSSet *employees = [department.employees filteredSetUsingPredicate:predicate];

        if ([employees count] == 0) {           
            [self.managedObjectContext deleteObject:department];
        } 
    }
}
Run Code Online (Sandbox Code Playgroud)

其他人建议把这个逻辑到-willSave的部门.我更喜欢上面的解决方案,因为在某些情况下我可能真的想要保存一个空的部门(例如在手动存储迁移或数据导入期间).