【问题标题】:Core data deleting rules核心数据删除规则
【发布时间】:2012-01-03 13:52:04
【问题描述】:

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

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

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

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

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

有什么建议吗?

【问题讨论】:

    标签: objective-c core-data


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我使用“numberOfPhotosTagged”属性对标签进行排序(最先使用)。这是排序描述符:[NSSortDescriptor sortDescriptorWithKey:@"numberOfPhotosTagged"升序:NO]
    • 啊,您应该可以使用tags.count 作为排序描述符,而不必使值保持同步。未经测试,因此无法保证,但它应该有效。
    • 因为我正在对标签进行排序,所以我使用了 '[NSSortDescriptor sortDescriptorWithKey:@"taggedPhotos.@count" descending:NO]' 但程序以以下错误结束:'Keypath contains KVC aggregate where should there不是一个;无法处理 taggedPhotos.@count'
    • @Ciampo 删除@,它应该只是@"taggedPhotos.count"
    • 不工作:它说'NSInvalidArgumentException', reason: 'to-many key not allowed here'。我再次添加了photoCount 属性,所以它可以工作了。
    【解决方案2】:

    所以,感谢 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 属性,因为我正在使用它对标签进行排序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-14
      • 1970-01-01
      • 2011-12-05
      • 1970-01-01
      • 2015-05-29
      • 2016-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多