我对NSPredicate的语法有疑问。我有3个实体:A,B和C.A与B有多对多的关系.B与C有多对多的关系。我想获取A中至少有一个关系的所有托管对象使用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我的应用程序[86086:60b] *由于未捕获的异常终止应用程序' NSInvalidArgumentException',原因:'包含KVC聚合的Keypath不应该是一个人;无法处理$ b.jobs。@ count'
然后:
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"ANY b.c.@count > 0"];
导致:
2014-06-30 09:10:14.403我的应用程序[86186:60b] *由于未捕获的异常终止应用程序' NSInvalidArgumentException',原因:'不支持的函数表达式计数: (BC)'
此外:
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"(SUBQUERY(B, $b, $b.c.@count > 0))"];
导致:
2014-06-30 09:17:25.883我的应用程序[86218:60b] *由于未捕获的异常终止应用程序' NSInvalidArgumentException',原因:'无法解析格式string"(SUBQUERY(B,$ b,$ bc @ count> 0))"'
最后:
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"(SUBQUERY(B, $b, $b.c).@count > 0)"];
结束于:
2014-06-30 09:18:30.202我的应用程序[86272:60b] *由于未捕获的异常终止应用程序' NSInvalidArgumentException',原因:'无法解析格式string"(SUBQUERY(B,$ b,$ bc)。@ count> 0)"'
任何人都有任何想法?必须有一个简单的方法来进行此取...
答案 0 :(得分:1)
这应该有效:
[NSPredicate predicateWithFormat:@"SUBQUERY(bs, $b, ANY $b.cs != NULL).@count > 0"]
其中“bs”是从实体 A 到 B 的多对多关系,而“cs”是来自 B的多对多关系到 C 。