Думаю, я понял это. Вот что я сделал.
Получите объект верхнего уровня Дом и его детскую комнату - кухню.
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]];
Надеюсь, это кому-нибудь поможет, дайте мне знать, если есть лучший способ сделать это или у вас есть вопрос о том, как я это сделал.