Ios NSPredicate,使用一对多关系的子集获取结果
我正在处理核心数据和Ios NSPredicate,使用一对多关系的子集获取结果,ios,core-data,nspredicate,nsfetchedresultscontroller,nsfetchrequest,Ios,Core Data,Nspredicate,Nsfetchedresultscontroller,Nsfetchrequest,我正在处理核心数据和NSFetchedResultsController 我的数据模型如下所示: 产品具有一对多关系,称为数据线。 dataLine实体有一个属性名theWeek 我想获取所有Productwheredataline.theWeek==someValue。这可以通过子查询轻松完成。但这会返回所有数据线。是否可以创建一个NSPredicate,返回产品,如果数据线仅具有数据线==someValue,是否可以创建一个子集?为“产品”实体创建一个提取请求: NSFetchRequest
NSFetchedResultsController
我的数据模型如下所示:
产品
具有一对多关系,称为数据线
。
dataLine
实体有一个属性名theWeek
我想获取所有
Product
wheredataline.theWeek==someValue
。这可以通过子查询轻松完成。但这会返回所有数据线。是否可以创建一个NSPredicate
,返回产品
,如果数据线仅具有数据线==someValue
,是否可以创建一个子集?为“产品”实体创建一个提取请求:
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity: [NSEntityDescription entityForName:@"Product" ...]]
然后使用带有“ANY”的产品属性创建谓词:
[fetchRequest setPredicate:
[NSPredicate predicateWithFormat:@"ANY dataLines.theWeek == %@", <whatever week>]];
[fetchRequest setPredicate:
[NSPredicate predicateWithFormat:@“ANY dataLines.theWeek==%@”,];
然后执行fetch以获取至少包含一个
的产品数组
一般请参见“获取托管对象”、NSPredicate和相关文档。
您应该取而代之的是获取dataLine
属性。
假设您的产品
和数据线
实体通过关系someRelation
连接,那么您可以尝试此代码
NSFetchRequest*fetchRequest=[[NSFetchRequest alloc]init];
[fetchRequest setEntity:[NSEntityDescription entityWithName:@“dataLine”inManagedObjectContext:self.managedObjectContext]];
[fetchRequest setPredicate:[NSPredicate Predicate WithFormat:@“dataLines.week==%@”,theWeek]];
NSMutableArray*tmpProduct[[NSMutableArray init]alloc];
NSMUTABLEARRY*tmpArray=[self.managedObjectContext executeFetchRequest:fetchRequest错误:&错误];
用于(数据线*tmpArray中的数据线);
NSLog(@“%@”,theDataLine.someRelation.name);
tmpProduct=theDataLine.someRelation.name;
然后,您只需调用
tmpProduct
即可在表视图中调用或显示您的产品可以通过两种方式实现您想要实现的目标:
使用子查询
[NSPredicate predicateWithFormat:@"SUBQUERY(dataLines, $x, $x.theWeek == %@).@count > 0)", [NSNumber numberWithInt:18]];
或任何修改器
[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]];
这同样适用于任何
修饰符<代码>任何。。。或任何…
也许如果你分享一些代码,我们可以帮助你
另外,我想你不用标量值,theWeek
是一个数字
希望有帮助。这基本上就是我现在正在做的事情。问题是这会返回包含所有数据线的所有产品。我想要的是:带有dataLines.theWeek=18和dataLines.theWeek=19的产品A。我只想返回带有数据线的产品A。theWeek=18。而不是数据线。theWeek=19。是否可能?不清楚-此产品是同一对象吗?如果是,很难理解您的问题您希望获取的产品有一条且只有一条数据线,例如Week=18?请提供一些代码或添加一些详细信息。谢谢。另外,您能解释一下您的意思吗?如果数据线仅具有dataLines==someValue,是否可以创建一个NSPredicate来返回产品和子集?这与你第一部分问题的目标是否相同?