Предикат для многих ко многим - PullRequest
2 голосов
/ 17 января 2012

Попытка обернуть мою голову вокруг предикатов и основных данных.У меня есть модель, которая выглядит следующим образом.

Дом <- >> Комната (в доме много комнат)
Комната << - >> Светильники (в комнатах много светильников, и многие светильники могут принадлежать комнатам)
Светильники <->> Fixture_Types (приборы имеют много типов)

Как должен выглядеть мой предикат, если у меня есть "Дом", и мне нужно получить все уникальные типы Fixture_type, где "комната" == "кухня" (или что-то еще).

Спасибо!

1 Ответ

1 голос
/ 17 января 2012

Думаю, я понял это. Вот что я сделал.

Получите объект верхнего уровня Дом и его детскую комнату - кухню.

Room *room = [house.rooms objectAtIndex:someIndex]; 

У меня есть порядок отображения, поэтому установите:

NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"displayOrder" ascending:YES];

У меня есть вспомогательная функция для получения объектов с определенным предикатом, поэтому:

+(NSArray *)objectsForEntityNamed:(NSString *)name withPredicate:(NSPredicate *)predicate inContext:(NSManagedObjectContext *)context{
    NSEntityDescription *entity = [NSEntityDescription entityForName:name inManagedObjectContext:context];

    NSFetchRequest *req = [[NSFetchRequest alloc] init];
    [req setEntity:entity];
    [req setPredicate:predicate];
    NSError *error = nil;

    NSArray *array = [context executeFetchRequest:req error:&error];

    if (array == nil){
        NSException *exception = [NSException exceptionWithName:CoreDataExeption reason:[error localizedDescription] userInfo:nil];

        [exception raise];

    }
    return array;

}

А теперь для хороших вещей, где fixture_types в предикате - это обратное отношение Fixture_Types к Fixtures. Конечно, вы можете сделать что-то особенное, но так как мой БД нормализован, я все равно получу только уникальные результаты:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"ANY fixture_types IN %@", room.fixtures];

NSArray *fixture_types = [[CDUtilities objectsForEntityNamed:@"Fixture_Types" withPredicate:pred inContext:[house managedObjectContext]] sortedArrayUsingDescriptors:[[NSArray alloc] initWithObjects:descriptor, nil]];

Надеюсь, это кому-нибудь поможет, дайте мне знать, если есть лучший способ сделать это или у вас есть вопрос о том, как я это сделал.

...