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

NSPredicate:如何将字符串视为数字?

IOS / Objective-C:核心数据NSPredicate使用IN不返回所有匹配

使用 NSPredicate 比较核心数据查询中的日期

iOS 核心数据 - NSFetchRequest 和 NSPredicate 不允许双重格式?

核心数据和 NSPredicate