在这种情况下,我应该使用什么NSPredicate来过滤核心数据关系?

时间:2016-01-30 13:48:32

标签: objective-c cocoa core-data

enter image description here

以上是我的核心数据关系。这是一个可可应用程序,有三个NSTableView显示流派,专辑和歌曲。 我想过滤GenreArrayController,使Genre TableView只显示Genre名称,其中专辑 - 歌曲长度为> 4。

当我在SongArrayController上使用谓词时:

[_songArrayController setFilterPredicate:[NSPredicate predicateWithFormat:@"length > 4"]];

结果是流派和专辑保持未过滤但歌曲表格会被过滤掉。是否有可能在流派上使用NSPredicate到达流派 - 专辑 - 歌曲。

我这样做是错误的,可以通过改变实体及其关系来实现。

2 个答案:

答案 0 :(得分:1)

您可以将谓词与&&组合使用,也可以使用更多的罗嗦复合谓词。您可以通过点表示法访问谓词中关系的键路径。因此,按类型过滤歌曲:

NSPredicate(format: "length > 4 && album.genre = %@", genreObject)

甚至

NSPredicate(format: "length > 4 && album.genre.name = %@", "Jazz")

答案 1 :(得分:1)

使用子查询,我可以过滤Genre,以便Genre表只显示流派,其专辑包含大于4的歌曲数量:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(albums, $x, ANY $x.songs.count > 4).@count != 0"];