核心数据获取结果减少相关项目集

时间:2014-08-05 23:01:58

标签: ios objective-c core-data nspredicate one-to-many

我有一个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?

提前致谢!

2 个答案:

答案 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];