如何创建一组实体,这些实体都与具有特定属性的其他实体有关系?在核心数据中

时间:2010-08-25 21:26:37

标签: objective-c ios core-data

我有一个名为“Card”的核心数据实体,它与另一个实体“CardInfo”有“info”关系。这是一对多关系:每张卡可以有多个CardInfos,但每张CardInfo只有一张卡。

CardInfo实体只有两个字符串,“cardKey”和“cardValue”。目的是允许任意输入卡片的数据。说,你想知道一张卡是什么颜色的。然后你为每张卡片添加了一张CardInfo,其中cardKey为“color”,cardValue为“black”或“red”。

我的一般问题是:获取卡片组的最佳方法是每张卡片都有CardInfo,其中CardKey和CardValue具有特定值。例如:与CardInfo cardKey ='color'和cardValue ='red'有关系的所有卡?理想情况下,我返回所有相应Card *对象的NSSet。

2 个答案:

答案 0 :(得分:2)

不需要最后的循环。一个简单的KVC调用可以很好地清理它。

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:@"CardInfo" inManagedObjectContext:self.managedObjectContext]];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"cardKey = %@ AND cardValue = %@", thisKey, thisValue]];

NSError *error = nil;
NSArray *items = [[self managedObjectContext executeFetchRequest:fetchRequest error:&error];
[fetchRequest release], fetchRequest = nil;
NSAssert1(error == nil, @"Error fetching objects: %@\n%@", [error localizedDescription], [error userInfo]);

return [items valueForKeyPath:@"@distinctUnionOfObjects.card"];

答案 1 :(得分:0)

这是我想出的答案,但这个由两部分组成的过程对我来说似乎效率低下。我认为必须有更优雅的方法来使用键值或其他东西

-(NSSet *)cardsWithCardKey:(NSString *)thisKey cardValue:(NSString *)thisValue {

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"CardInfo" 
        inManagedObjectContext:self.managedObjectContext];

    [fetchRequest setEntity:entity];

    NSPredicate *predicate = [NSPredicate
                              predicateWithFormat:@"(cardKey=%@) AND (cardValue=%@)",
                              thisKey,thisValue];

    [fetchRequest setPredicate:predicate];

    NSError *error;
    NSArray *items = [self.managedObjectContext 
        executeFetchRequest:fetchRequest error:&error];
    [fetchRequest release];

    NSMutableSet *cardSet = [NSMutableSet setWithCapacity:[items count]];
    for (int i = 0 ; i < [items count] ; i++) {
        if ([[items objectAtIndex:i] card] != nil) {
            [cardSet addObject:[[items objectAtIndex:i] card]];
        }
    }
    return [NSSet setWithSet:cardSet];
}