ios - 低效的CoreData IN查询

标签 ios sql sqlite core-data nspredicate

我已经有了一个非常简单的CoreData设置,看起来像这样:

Track {
    NSSet *artists;
    NSSet *genres;
}

Artist {
    NSSet *tracks;
}

Genre {
    NSSet *tracks;
}

所以这里的想法是,一个Track可以有多个GenreArtist。在两种情况下,回溯到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/

相关文章:

ios - 导航到另一个 ViewController 时,UITableView 行有问题

objective-c - Xcode - UIStoryboard黑屏

ios - 阻止 `self` 在 block 中创建强引用

SQL 选择至少一列不为 NULL 的所有行

ios - SQLite iOS 插入数据

ios - 在tableview中插入和删除单元格,将文本字段放入单元格中,然后将文本字段数据放入swift中的json原始参数中

Mysql:无法创建表 errno 150

sql - 如何在Sql Server中检查字符串长度然后选择子字符串

差异 sqlite 表的 Git 钩子(Hook)

python-3.x - 带有 Flask、sqlalchemy 和 sqlite 的 Openshift 应用程序 - 数据库恢复问题