iOS核心数据如何使用NSPredicate根据一对多的子属性查找父对象?
Posted
技术标签:
【中文标题】iOS核心数据如何使用NSPredicate根据一对多的子属性查找父对象?【英文标题】:iOS Core data how to use NSPredicate to find parent objects based on one to many child properties? 【发布时间】:2013-06-14 13:13:59 【问题描述】:我有一个核心数据模型,如下所示:
一个ServiceProvider
实体可以有许多Service
实体(一对多关系)。每个服务都有一个type
属性。
如何使用Service
实体的type
属性来搜索具有该类型服务的ServiceProviders
?
以下是我目前拥有的适用于单一服务关系的示例。 如何修改以下谓词以适用于多种服务?
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSManagedObjectContext* context = [HealthDataManager sharedInstance].managedObjectContext;
NSEntityDescription *entity = [NSEntityDescription entityForName:@"ServiceProvider" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"self.service.type == %i",type]];
NSArray* results = [context executeFetchRequest:fetchRequest error:nil];
if(results.count>0)
for(ServiceProvider* provider in results)
DLog(@"found provider: %@", [provider description ]);
return [results lastObject];
else
DLog(@"Creating provider" );
【问题讨论】:
【参考方案1】:要查找具有给定类型的任何相关服务的对象,请使用谓词
[NSPredicate predicateWithFormat:@"ANY services.type == %i",type];
(假设“服务”是 to-name 关系的名称)。
【讨论】:
【参考方案2】:您需要为此使用子查询:NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(SUBQUERY(service, $service, $service.type == %i).@count) > 0"];
。
有关子查询和其他谓词如何工作的更多信息,您应该查看Predicate Programming Guide。
【讨论】:
请注意$service.type
应该是 $a.type
才能完成这项工作。
有趣,这些子查询看起来很强大,我得记住怎么做。以上是关于iOS核心数据如何使用NSPredicate根据一对多的子属性查找父对象?的主要内容,如果未能解决你的问题,请参考以下文章
我如何在单个提取请求中调用两个 NSPredicate。核心数据 iOS Swift
IOS / Objective-C:核心数据NSPredicate使用IN不返回所有匹配