多对多谓词

问题描述:

试图围绕谓词和核心数据进行思考。我有一个看起来像这样的模型。多对多谓词

家< - >>间(府有许多房间)<
房< - >>灯具(房间有许多灯具和许多灯具可以属于房)
灯具< - >> Fixture_Types(灯具有很多类型)

我的谓词应该是什么样子,如果我有“房子”,我需要获得所有独特的Fixture_types其中“房间”==“厨房”(或其他)。

谢谢!

+0

夹具如何同时属于两个房间? – 2012-01-16 22:10:51

+0

@MarkAdams - 将其视为多个房间重复使用的灯具。这是标准的标准化。考虑一个数据库,例如,你有一个Employee表和一个Position表。员工可以有很多职位,并且一个职位(例如会计)可以由许多员工担任。相同的逻辑适用于_tweeznasty_的房间与灯具的关系。 – Jeremy 2012-01-16 22:19:50

+0

我理解标准化,但我不明白的是'Fixture'的一个例子可以同时属于两个房间。按照您的员工类比,多对多关系应该在'Room'和'Fixture_Types'之间,因为会计职位不是一个人占用的实际职位,而是一种可应用于多个人的职位。 – 2012-01-16 22:33:28

我想我想通了。这是我做的。

获取*对象房子和它的孩子的房间 - 厨房。

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]]; 

希望这可以帮助别人,让我知道是否有更好的方法来做到这一点,或者如果你有问我是如何做到的。