NSPredicate为2对多关系

时间:2014-06-30 13:53:26

标签: ios core-data nspredicate

我对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)"'

任何人都有任何想法?必须有一个简单的方法来进行此取...

1 个答案:

答案 0 :(得分:1)

这应该有效:

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

其中“bs”是从实体 A B 的多对多关系,而“cs”是来自 B的多对多关系 C