我有一个NSFetchResult,它返回包含许多相关对象(Aobj - >> Bobj)的托管对象。 “Bobj”托管对象包含BOOL属性“isSet”(存储为NSNumber)。 NSFetchResult返回所有Aobj对象。
我想建议NSPredicate返回Aobj,只返回那些isSet为TRUE(@ 1)的Bojs。
目前,我列举了我的获取结果返回的我的NSArray Aobjs,以便我可以通过这种方式获取我过滤的Aobjs NSArray:
- (NSArray *)filteredObject:(Aobj *)aObj
{
NSMutableArray* bObjs = [aObj.bObjs mutableCopy];
[bObjs enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(Bobj* bObj, NSUInteger idx, BOOL *stop)
{
if (bObj.isSet == [NSNumber numberWithBool:NO])
{
[bObjs removeObject:story];
}
}];
return bObjs;
}
问另一种方法:我如何为我的NSFetchResult定义一个NSPredicate,它将获得我所有的Aobjs,但是将相关的Bobjs限制为匹配Bobj.isSet的那些== YES?
提前致谢!
答案 0 :(得分:0)
使用子查询。子查询遵循以下通用格式:
SUBQUERY(relationship, related_thing, predicate)
relationship
是被评估对象的关系。
related_thing
是关系中的一个单独对象。它以$为前缀,然后在谓词中使用(为清楚起见,未在上面显示)。
predicate
是适用于related_thing
的谓词。
用你的例子,它看起来像(假设你的关系被称为'bobjs'):
SUBQUERY(bobjs, $obj, $obj.isSet == YES)
子查询可以非常强大。例如,您还可以将集合运算符应用于子查询:
SUBQUERY(bobjs, $obj, $obj.isSet == YES).@count > 1
会给你每个AObj在'bobjs'关系中至少有一个对象,isSet等于YES。显然,您可以使用其他集合运算符或图层逻辑运算或其他表达式。
答案 1 :(得分:0)
NSPredicate *myPredicate = [NSPredicate predicateWithFormat:@"SELF.bObjs.isSet == YES"];
[myFetchRequest setPredicate:myPredicate];
NSArray *array = [moc executeFetchRequest:myFetchRequest error:&error];