2010-02-04 66 views
20

我有两个类A和B,从A到B(多个A对象可能引用相同的B)具有多对一的关系。问题是,如果A方的删除规则是级联,只有删除了引用A的上一个或将删除第一个时删除了关联的A时才会删除B.如果有关系,关系B方的删除规则是Nullify。iPhone核心数据:通过多对一的关系级联删除

另外,我在核心数据文档中看到可选标志在某些情况下很重要。但不清楚他们所阐明的关系与我的案例有何关系。他们在谈论一个遏制案(B由A拥有),而我的案例是订阅/协会(B与A有关)。

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

有什么建议吗?

回答

14

我有同样的目标,你显然有(只要最后引用的一个被删除删除)。我花了比预期更长的时间才得到这个权利。特别是因为

  • 当时一个准备删除,在的一对多关系可能尚未更新,所以你不能只算一个引用。
  • 请将isDeleted上一个似乎在-prepareForDeletion

这里已经设置就是为我工作,如果任何人的兴趣(我将使用 < - >>员工因为它更容易阅读):

雇员

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

其他人建议将此逻辑放入-willSave部门。我更喜欢上述解决方案,因为在某些情况下(例如在手动存储迁移或数据导入期间),我实际上可能想要保存空白部门。

+0

只是一个建议...由于文档不说,这是没有必要的消息超级,它可能是一个好主意,做所以:[super prepareForDeletion] – 2016-02-05 15:29:36

0

这里有一个斯威夫特4版本卢卡斯回答:

public override func prepareForDeletion() { 
    guard let department = department else { return } 

    if department.employees.filter({ !$0.isDeleted }).isEmpty { 
     managedObjectContext?.delete(department) 
    } 
}