1

我有一个非常简单的 CoreData 设置,如下所示:

Track {
    NSSet *artists;
    NSSet *genres;
}

Artist {
    NSSet *tracks;
}

Genre {
    NSSet *tracks;
}

所以这里的想法是,aTrack可以有多个Genres 和Artists。在这两种情况下都存在反比关系Track

我正在尝试获取Artist至少有Track一个给定的 s 列表Genre。我正在使用以下谓词:[NSPredicate predicateWithFormat:@"ANY tracks in %@", genre.tracks].

大多数时候这很快,但有时我有一个Genre10k+ Tracks。这会生成一个包含 10k+ 个变量的 SQL 查询……这需要很长时间才能运行。

我已经尝试了各种方法来避免这种情况,包括:

[NSPredicate predicateWithFormat:@"ANY %@ in tracks", genre.tracks]
[NSPredicate predicateWithFormat:@"SELF IN SUBQUERY(tracks, $t, %@ IN $t.genres)", genre]
[NSPredicate predicateWithFormat:@"(SUBQUERY(tracks, $t, %@ IN $t.genres).@count > 0)", genre];

可能还有一些我已经忘记了。这些中的每一个都可以编译,但不返回任何Artist对象。

我可以做些什么来提高我开始使用的 IN 查询的效率(哪个有效)?

4

1 回答 1

3

您可以使用

[NSPredicate predicateWithFormat:@"(SUBQUERY(tracks, $t, ANY t.genres = %@).@count > 0)", genre]

这给出了与原始谓词相同的结果,但避免使用许多参数构建查询。

于 2013-02-13T05:17:17.727 回答