核心数据删除规则

时间:2012-01-03 13:52:04

标签: objective-c core-data

我的数据库有3个实体:照片,地点(拍摄照片的地方)和标签(照片)。

database

每张照片都与拍摄地点有关系。 每个地方都有一组照片。

每张照片都有一组标签,每个标签都有一组照片。这是一种多对多关系,因为一张照片可以有多个标签,而标签可以与多张照片相关联。

现在,我无法找出针对此行为的正确删除规则:

  • 我想直接删除照片实体。
  • 如果相关地点有其他照片,则不应删除。如果照片是该地点的最后一张照片,则应将其删除。
  • 相关标签出现在其他照片中,在没有其他照片关联之前不应删除它们。
  • 此外,在标签实体中,我有一个属性可以跟踪与其关联的照片数量(我在添加新照片时以及照片的prepareForDeletion中更新此属性)。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

首先,标签不需要单独的属性来跟踪照片的数量。您可以查询该计数的关系。

其次,您需要在-prepareForDeletion实体中设置一个Photo,以检查它是否是唯一带有对该标记的引用的照片,如果是真的则删除它。

同样,当您删除照片时,在其-prepareForDeletion中,您可以查看该地方有多少张照片并调用相同的逻辑。

在模型本身中,我会将删除规则设置为无效。

答案 1 :(得分:1)

所以,感谢Marcus,我已将所有删除规则设置为Nullify,然后我在照片prepareForDeletion中编写了此代码:

- (void)prepareForDeletion
{    
    //tag check: if this photo was the last associated with that tag, deletion !!
    for (Tag *tag in self.tags) {
        if ([tag.taggedPhotos count] == 1) {
            [self.managedObjectContext deleteObject:tag];
        } else {
            tag.photoCount = [NSNumber numberWithInt:[tag.photoCount intValue]-1];
        }
    }

    //place check: if this photo was the last associated with that place, deletion !!
    if ([self.whereTaken.photos count] == 1) {
        [self.managedObjectContext deleteObject:self.whereTaken];
    }
}

我没有删除numberOfPhotosTagged属性,因为我正在使用它来对标记进行排序。