多对多谓词
问题描述:
试图围绕谓词和核心数据进行思考。我有一个看起来像这样的模型。多对多谓词
家< - >>间(府有许多房间)<
房< - >>灯具(房间有许多灯具和许多灯具可以属于房)
灯具< - >> Fixture_Types(灯具有很多类型)
我的谓词应该是什么样子,如果我有“房子”,我需要获得所有独特的Fixture_types其中“房间”==“厨房”(或其他)。
谢谢!
答
我想我想通了。这是我做的。
获取顶级对象房子和它的孩子的房间 - 厨房。
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]];
希望这可以帮助别人,让我知道是否有更好的方法来做到这一点,或者如果你有问我是如何做到的。
夹具如何同时属于两个房间? – 2012-01-16 22:10:51
@MarkAdams - 将其视为多个房间重复使用的灯具。这是标准的标准化。考虑一个数据库,例如,你有一个Employee表和一个Position表。员工可以有很多职位,并且一个职位(例如会计)可以由许多员工担任。相同的逻辑适用于_tweeznasty_的房间与灯具的关系。 – Jeremy 2012-01-16 22:19:50
我理解标准化,但我不明白的是'Fixture'的一个例子可以同时属于两个房间。按照您的员工类比,多对多关系应该在'Room'和'Fixture_Types'之间,因为会计职位不是一个人占用的实际职位,而是一种可应用于多个人的职位。 – 2012-01-16 22:33:28