Данные ядра iOS, как использовать NSPredicate для поиска родительских объектов на основе одного или нескольких дочерних свойств?

У меня есть модель Core Data, которая выглядит следующим образом:

ServiceProvider Сущность может иметь много Service Сущностей (отношение «один ко многим»). У каждой службы есть атрибут type.

Как я могу использовать атрибут type объекта Service для поиска 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" );
    }

person Alex Stone    schedule 14.06.2013    source источник


Ответы (2)


Чтобы найти объекты, которые имеют любую связанную службу с заданным типом, используйте предикат

[NSPredicate predicateWithFormat:@"ANY services.type == %i",type];

(при условии, что «услуги» - это имя отношения к нам).

person Martin R    schedule 14.06.2013

Для этого вам нужно использовать подзапросы: NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(SUBQUERY(service, $service, $service.type == %i).@count) > 0"];.

Для получения дополнительной информации о том, как работают подзапросы и другие предикаты, вы должны проверить Руководство по программированию предикатов.

person Gianluca Tranchedone    schedule 14.06.2013
comment
Обратите внимание, что $service.type должно быть $a.type, чтобы эта работа работала. - person Martin R; 14.06.2013
comment
Интересно, что эти подзапросы выглядят довольно мощно, мне нужно будет вспомнить, как их выполнять. - person Alex Stone; 14.06.2013