【发布时间】:2013-01-28 12:37:01
【问题描述】:
我已经完成了一个非常简单的 CoreData 设置,如下所示:
Track {
NSSet *artists;
NSSet *genres;
}
Artist {
NSSet *tracks;
}
Genre {
NSSet *tracks;
}
所以这里的想法是,一个Track 可以有多个Genres 和Artists。在这两种情况下,与 Track 之间存在反比关系。
我正在尝试获取Artists 的列表,其中至少有一个Track 和给定的Genre。我正在使用以下谓词:[NSPredicate predicateWithFormat:@"ANY tracks in %@", genre.tracks]。
大多数时候这很快,但有时我有一个 Genre 和 10k+ 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 查询的效率(哪个有效)?
【问题讨论】:
-
(SUBQUERY(tracks, $t, ANY t.genres = %@).@count > 0)", genre呢? -
我们赢了!!谢谢,我花了几个小时没有尝试那种特殊的魔法组合。如果您将其输入为正确的回复,我会很乐意将其标记为答案。
标签: ios sql sqlite core-data nspredicate