多对多的谓词

时间:2012-01-16 22:04:59

标签: objective-c ios core-data

试图绕过谓词和核心数据。我有一个看起来像这样的模型。

House< - >>房间(房子有很多房间)
房<< - >>固定装置(房间有许多固定装置,许多固定装置可以属于房间)
固定装置< - >> Fixture_Types(灯具有很多种类型)

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

谢谢!

1 个答案:

答案 0 :(得分:1)

我想我明白了。这就是我做的。

获得顶级对象House及其儿童房 - 厨房。

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

希望这有助于某人,让我知道是否有更好的方法来做到这一点,或者如果你对我是如何做到这一点有疑问。