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
。这可以通过子查询轻松完成。但这会返回所有数据线。是否可以创建一个返回Product
的NSPredicate
和一个子集(如果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
属性。
假设您的 Product
和 dataLine
实体通过关系 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 以获取包含至少一个 <whatever week>
的 Product 数组。
一般参见“获取托管对象”、NSPredicate 和相关文档。
【讨论】:
这基本上就是我现在正在做的。问题是这将返回所有具有所有数据行的产品。我想要的是:dataLines.theWeek = 18 和 dataLines.theWeek = 19 的产品 A。我只想返回 dataLines.theWeek = 18 的产品 A。而不是 dataLines.theWeek = 19。有可能吗? 不清楚——这个产品A是同一个对象吗?如果是,你的问题很难理解 您希望获取的 Product 有一个且只有一个 dataLine,例如 Week = 18?以上是关于NSPredicate,使用一对多关系的子集获取结果的主要内容,如果未能解决你的问题,请参考以下文章
NSPredicate 用于从一对多关系中获取项目,不包括特定的相关实体