NSPredicate用于两个多对多关系。

4
我有一个NSPredicate语法问题。我有三个实体:A,B和C。 A与B有多对多的关系。B与C也有多对多的关系。我想获取所有在A中的托管对象,这些托管对象至少与B中的一个对象有关系,而B又至少与C中的一个对象有关系。
我尝试了几种SUBQUERY和ANY的变体,但显然我没有使用正确的语法。
我尝试过:
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *ent = [NSEntityDescription entityForName:@"A" inManagedObjectContext:self.managedObjectContext];
fetchRequest.entity = ent;
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"(SUBQUERY(B, $b, $b.c.@count > 0).@count > 0)"];

这导致了以下错误:

2014-06-30 09:07:12.143 My App[86086:60b] * 因未捕获的异常 'NSInvalidArgumentException' 终止应用程序,原因是:'Keypath containing KVC aggregate where there shouldn't be one; failed to handle $b.jobs.@count'

接着:

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"ANY b.c.@count > 0"];

导致如下结果:

2014-06-30 09:10:14.403 My App[86186:60b] * 应用程序因未捕获的异常 'NSInvalidArgumentException' 而终止,原因是:不支持函数表达式 count:(b.c)

此外:

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"(SUBQUERY(B, $b, $b.c.@count > 0))"];

导致:

2014-06-30 09:17:25.883 My App[86218:60b] * 应用程序终止,原因是未捕获的异常 'NSInvalidArgumentException',原因是:无法解析格式字符串“(SUBQUERY(B, $b, $b.c.@count > 0))”'

最后:

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"(SUBQUERY(B, $b, $b.c).@count > 0)"];

结束于:

2014-06-30 09:18:30.202 My App[86272:60b] * 应用程序由于未捕获的异常“NSInvalidArgumentException”而终止,原因是:“无法解析格式字符串“(SUBQUERY(B,$b,$b.c).@count > 0)”'

有人有任何想法吗? 必须有一种简单的方法来执行此获取...

1个回答

2

这应该可以工作:

[NSPredicate predicateWithFormat:@"SUBQUERY(bs, $b, ANY $b.cs != NULL).@count > 0"]

这里,“bs”是从实体AB的一对多关系,“cs”是从BC的一对多关系。


谢谢,那个方法可行!你是怎么想出那个查询语句的?我仍在努力将SQL查询语句在脑海中理清,并将其转换为NSPredicate。我应该提一下,我不是数据库管理员或大师... - nemesys
@nemesys:我之前通过尝试和错误找到了解决方法 :) 通常,我不会试图以SQL的术语来思考,而是以(Core Data)关系为基础。 - Martin R
@MartinR 你好Martin,非常好的答案,也许你能帮帮我。我的关系是Object<->>addresses<->>phones,我需要检查phones.tel是否包含我的电话号码,我尝试使用[NSPredicate predicateWithFormat:@"ANY addresses.phones.tel = %@", telNumber],但是我收到错误信息** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'multiple to-many keys not allowed here',你能给些建议吗?谢谢! - Roman Simenok

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接