核心数据,过滤掉结果集中的子实体

时间:2010-10-07 02:18:05

标签: iphone core-data

所以我有典型的1:M关系:

Car can have many Models

我想要获取所有Car对象,并且只获取以'A'开头的模型名称。

我尝试了一个子查询:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Car" inManagedObjectContext:_context];
[fetchRequest setEntity:entity];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(models, $model, $model.name BEGINSWITH 'A').@count > 0"];    
[fetchRequest setPredicate:predicate];

只要它具有以“A”开头的模型,这基本上会返回Car。这没关系,但是对于所有返回的Car,它也会返回所有Model个,而我只想要那些以'A'开头的那些

但是只要我在更高级别的实体(Car)上运行,那么该子查询只会过滤Cars并且根本不会过滤Models

我现在正在做的是在内部循环中过滤Models(使用另一个NSPredicate),但我宁愿在SQL端进行此过滤。

想法?

1 个答案:

答案 0 :(得分:1)

使用谓词运行对Models实体的抓取:

[NSPredicate predicateWithFormat:@"name BEGINSWITH 'A'"];

从结果数组NSArray *result中,您可以获得KVC的所有Cars

[result valueForKey:@"car"];

假设你的1:M CarsModels关系有1:1的反比关系(顺便说一下,你应该使用反向关系来保持对象图的一致性)。

如果您只想要一组唯一的Cars

[result valueForKeyPath:@"@distinctUnionOfObjects.car"];

NSSet *cars = [NSSet setWithArray:[result valueForKey:@"car"]];