NSPredicate,以一对多关系的子集获得结果

时间:2012-06-01 22:06:32

标签: ios core-data nspredicate nsfetchedresultscontroller nsfetchrequest

我正在使用Core Data和NSFetchedResultsController

我的数据模型如下所示:

Product名为dataLines的一对多关系。 dataLine实体的属性名称为theWeek

我想要获取所有Product dataLines.theWeek == someValue。使用子查询可以轻松完成此操作。但是这会返回所有dataLines。是否可以创建一个返回NSPredicate的{​​{1}}和一个只有Product的dataLines的子集?

3 个答案:

答案 0 :(得分:8)

您希望通过两种方式达成目标:

使用SUBQUERY

[NSPredicate predicateWithFormat:@"SUBQUERY(dataLines, $x, $x.theWeek == %@).@count > 0)", [NSNumber numberWithInt:18]];

或ANY修饰符

[NSPredicate predicateWithFormat:@"ANY dataLines.theWeek == %@", [NSNumber numberWithInt:18]];

如果您需要检查多个值,也可以执行以下操作:

[NSPredicate predicateWithFormat:@"SUBQUERY(dataLines, $x, $x.theWeek == %@ or $x.theWeek == %@).@count > 0)", [NSNumber numberWithInt:18], [NSNumber numberWithInt:19]];

同样可以应用于ANY修饰符。 ANY ... OR ANY ...

也许如果你分享一些代码,我们可以帮助你。

P.S。我想你不使用标量值,而theWeek是一个数字。

希望它有所帮助。

答案 1 :(得分:1)

您应该获取dataLine属性。 假设您的ProductdataLine实体按关系someRelation连接,那么您可以尝试使用此代码;

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityWithName:@"dataLine" inManagedObjectContext:self.managedObjectContext]];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"dataLines.week == %@",theWeek]];

NSMutableArray *tmpProduct [[NSMutableArray init] alloc];
NSMutableArray *tmpArray = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];

for (dataLine *theDataLine in tmpArray);
NSLog(@"%@",theDataLine.someRelation.name);
tmpProduct = theDataLine.someRelation.name;

然后您只需致电tmpProduct即可在表格视图中调用或显示您的产品

答案 2 :(得分:0)

为“产品”实体创建获取请求:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity: [NSEntityDescription entityForName:@"Product" ...]]

然后使用带有'ANY'的Product的属性/属性创建谓词:

[fetchRequest setPredicate:
  [NSPredicate predicateWithFormat:@"ANY dataLines.theWeek == %@", <whatever week>]];

然后执行fetch以获取至少有一个<whatever week>的Product数组。

通常可以参阅“获取托管对象”,NSPredicate和相关文档。