任何to-many to-many谓词

时间:2012-08-10 05:51:54

标签: objective-c cocoa core-data nspredicate

我可以得到像

这样的谓词
ANY alpha.prop LIKE $SEARCH_TERM

alpha 是多对多关系的地方工作,但我该如何获得

ANY alpha.beta.prop LIKE $SEARCH_TERM

alpha 是多对多关系的情况下工作 beta 是多对多关系 alpha ,这会引发异常'此处不允许的多个密钥'。

2 个答案:

答案 0 :(得分:1)

你可以分两步完成。我们假设b是从AB的一对多关系,c是从BC的一对多关系{1}},然后您可以首先获取与具有所需属性的任何B对象相关的所有C个对象:

NSFetchRequest *request1 = [NSFetchRequest fetchRequestWithEntityName:@"B"];
NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"ANY(c.prop) LIKE %@", searchTerm];
request1.predicate = predicate1;
NSArray *bList = [context executeFetchRequest:request1 error:NULL];

然后从中间结果中获取与任何A对象相关的所有B个对象:

NSFetchRequest *request2 = [NSFetchRequest fetchRequestWithEntityName:@"A"];
NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"ANY(b) IN %@", bList];
request2.predicate = predicate2;

NSArray *aList = [context executeFetchRequest:request2 error:NULL];

答案 1 :(得分:0)

好的方法是在底部子元素上进行搜索,以便查询字符串变为

prop LIKE $SEARCH_TERM

然后枚举结果并抓住父级的父级并将它们粘贴在一个集合中以删除重复项,例如

NSMutableSet  * mySet = [NSMutableSet set];
for( MyChild * c in [self.managedObjectContext executeFetchRequest:theFetchRequest error:&theError] )
{
    [mySet addObject:c.parent.parent];
}