2

我正在使用 Core Data 和NSFetchedResultsController.

我的数据模型如下所示:

Product一对多的关系称为dataLines. 该dataLine实体有一个属性名称theWeek

我想取所有Product的地方dataLines.theWeek == someValue。这可以通过子查询轻松完成。但这会返回所有数据线。如果 dataLines 仅带有 ,是否可以创建一个NSPredicate返回和 的子集?ProductdataLines == someValue

4

3 回答 3

8

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

使用子查询

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

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

PS我想你不使用标量值并且theWeek是一个数字。

希望能帮助到你。

于 2012-06-02T11:15:39.650 回答
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来打电话或在表格视图中显示你的产品

于 2012-06-02T10:56:26.883 回答
0

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

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

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

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

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

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

于 2012-06-01T23:25:18.373 回答