我已经有了一个非常简单的CoreData设置,看起来像这样:
Track {
NSSet *artists;
NSSet *genres;
}
Artist {
NSSet *tracks;
}
Genre {
NSSet *tracks;
}
所以这里的想法是,一个
Track
可以有多个Genre
和Artist
。在两种情况下,回溯到Track
的关系都相反。我正在尝试获取
Artist
的列表,该列表至少具有给定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查询的效率(可行)?
最佳答案
您可以使用
[NSPredicate predicateWithFormat:@"(SUBQUERY(tracks, $t, ANY t.genres = %@).@count > 0)", genre]
给出与原始谓词相同的结果,但避免构建具有许多参数的查询。
关于ios - 低效的CoreData IN查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14845532/