iPhone核心数据: Cascading delete across a many-to-one relationship

标签 iphone cocoa cocoa-touch core-data cascading-deletes

我有两个类 A 和 B,从 A 到 B 具有多对一关系(多个 A 对象可能引用同一个 B)。问题是,如果A端的删除规则是Cascade,那么B是只有在最后引用A的时候被删除,还是第一次引用A的时候才被删除呢?关联的 A 被删除。如果重要的话,关系 B 方的删除规则是无效。

此外,我在核心数据文档中读到,可选标志在某些情况下很重要。但尚不清楚他们所描述的关系与我的案件有何关系。他们谈论的是收容案例(B 属于 A),而我的案例是订阅/关联案例(B 与 A 相关)。

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

有什么建议吗?

最佳答案

我的目标显然与您相同(删除最后引用的A后立即删除B)。我花了比预期更长的时间才把这件事做好。特别是因为

  • A准备删除时,B中的一对多关系可能还没有更新,所以不能只算A B中引用。
  • A 上的 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中。我更喜欢上面的解决方案,因为在某些情况下我实际上可能想保存一个空部门(例如在手动商店迁移或数据导入期间)。

关于iPhone核心数据: Cascading delete across a many-to-one relationship,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2204150/

相关文章:

ios - 如何在 iOS 中以编程方式添加默认日历

objective-c - 将 UISwitch 添加到 UINavigationItem

iphone - 重用 NSURLConnection 实例

iphone - Game Center 分数停留在特定分数

ios - AppleScript 创建 Xcode 目标的副本

ios - Foundation.framework是属于CoreService层还是CocoaTouch层?

objective-c - 使用 [NSString stringWithString : @"some string"] versus @"some string" 的优缺点

ios - 缩放 CALayer 内容的大小

ios - 使用 Cocoa Touch 框架构建

iPhone:使用进度动画加载数据?