NSPredicate,使用一对多关系的子集获取结果

Posted

技术标签:

【中文标题】NSPredicate,使用一对多关系的子集获取结果【英文标题】:NSPredicate, get results with a subset of one-to-many relationship 【发布时间】:2012-06-01 22:06:31 【问题描述】:

我正在使用 Core Data 和 NSFetchedResultsController

我的数据模型如下所示:

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

我想获取所有Product,其中dataLines.theWeek == someValue。这可以通过子查询轻松完成。但这会返回所有数据线。是否可以创建一个返回ProductNSPredicate 和一个子集(如果dataLines 仅使用dataLines == someValue)?

【问题讨论】:

请提供一些代码或添加一些细节。谢谢。 另外,您能否解释一下如果dataLines 仅使用dataLines == someValue,是否可以创建一个返回产品和子集的NSPredicate?这是否与您的第一部分问题的目标相同? 【参考方案1】:

您想要达到的目标可以通过两种方式实现:

使用子查询

[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 ....

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

附:我想你不使用标量值,theWeek 是一个数字。

希望对你有帮助。

【讨论】:

【参考方案2】:

您应该改为获取 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 即可调用或在表格视图中显示您的产品

【讨论】:

【参考方案3】:

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

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

然后使用带有“ANY”的 Product 的属性/属性创建一个谓词:

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

然后执行 fetch 以获取包含至少一个 &lt;whatever week&gt; 的 Product 数组。

一般参见“获取托管对象”、NSPredicate 和相关文档。

【讨论】:

这基本上就是我现在正在做的。问题是这将返回所有具有所有数据行的产品。我想要的是:dataLines.theWeek = 18 和 dataLines.theWeek = 19 的产品 A。我只想返回 dataLines.theWeek = 18 的产品 A。而不是 dataLines.theWeek = 19。有可能吗? 不清楚——这个产品A是同一个对象吗?如果是,你的问题很难理解 您希望获取的 Product 有一个且只有一个 dataLine,例如 Week = 18?

以上是关于NSPredicate,使用一对多关系的子集获取结果的主要内容,如果未能解决你的问题,请参考以下文章

NSPredicate 用于从一对多关系中获取项目,不包括特定的相关实体

在一对多关系中使用 NSPredicate 进行过滤

CoreData 获取所有一对多关系

NSPredicate 与关系

iOS:“@count == 0”的 NSPredicate 用于一对一和一对多关系

CoreData:使用 NSPredicate 过滤一对多对多关系(此处不允许错误对多键)