2012-01-03 78 views
3

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

database

的每张照片都在其中已经采取了地方的关系。 每个地方都有一组照片。

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

,我无法找出正确的删除规则,这种行为:

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

有什么建议吗?

回答

1

所以,谢谢马库斯,我已经将所有的删除规则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属性,因为我”用它来排序标签。

2

首先,标签不应该需要单独的属性来跟踪照片的数量。您可以查询该计数的关系。其次,您需要在Photo实体中设置一个-prepareForDeletion,该实体检查是否是唯一带有对该标记的引用的照片,如果是,则删除它。

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

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

+0

我用了“numberOfPhotosTagged”属性进行排序标签(最常用的第一)。这是那种描述: [NSSortDescriptor sortDescriptorWithKey:@“numberOfPhotosTagged”上升:NO] – Ciampo 2012-01-03 19:43:34

+0

啊,你应该能够使用'标签.count'作为一个排序描述符,而不必保持同步值。没有测试,所以没有保证,但它*应*工作。 – 2012-01-03 19:45:09

+0

因为我在排序标签,我用'[NSSortDescriptor sortDescriptorWithKey:@“taggedPhotos。@ count'ascending:NO]',但程序结束白衣这个错误:'关键路径包含KVC聚合,不应该有一个;无法处理标记的照片。@ count' – Ciampo 2012-01-04 08:31:01