Objective c 核心数据删除规则

Objective c 核心数据删除规则,objective-c,core-data,Objective C,Core Data,我的数据库有3个实体:照片、地点(拍摄照片的地方)和标签(照片) 每张照片都与拍摄地点有关。 每个地方都有一组照片 每个照片都有一组标签,每个标签都有一组照片。这是一种多对多关系,因为一张照片可以有多个标记,并且一个标记可以与多张照片关联 现在,我想不出这种行为的正确删除规则: 我只想直接删除照片实体 如果相关地点拍摄了其他照片,则不应将其删除。如果该照片是该地点的最后一张照片,则应将其删除 如果相关标签出现在其他照片中,则在没有其他相关照片之前,不应删除这些标签 此外,在标记实体中,我有一

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

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

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

现在,我想不出这种行为的正确删除规则:

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

有什么建议吗

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

其次,您需要在
照片
实体中设置一个
-preparefordelection
,检查它是否是唯一一张引用了标记的照片,如果是,则删除它

同样,当您删除照片时,可以在其
-prepareForDeletion
中检查该位置有多少照片,并调用相同的逻辑


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

因此,感谢Marcus,我将所有删除规则设置为
null
,然后我在照片的
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];
    }
}

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

我使用了“numberoftopstaged”属性对标签进行排序(最早使用)。。这是排序描述符:[NSSortDescriptor SortDescriptor WithKey:@“numberOfPhotosTagged”升序:否]啊,您应该能够使用
标记。将
计数为排序描述符,并避免保持值同步。未测试,因此无法保证它会正常工作。因为我正在对标记进行排序,所以我使用了“[NSSortDescriptor SortDescriptor WithKey:@”taggedPhotos@count“升序:否”),但程序以以下错误结束:“包含KVC聚合的键路径,其中不应该有一个;无法处理taggedPhotos。@count'@Ciampo删除
@
,它应该是“taggedPhotos.count”不工作:它说
'NSInvalidArgumentException',原因是:'此处不允许使用多个键'
。我再次添加了
photoCount
属性,因此它工作正常。