Как вы создаете набор сущностей, которые имеют отношения к другим сущностям с определенными атрибутами В основных данных - PullRequest
0 голосов
/ 26 августа 2010

У меня есть сущность Core Data, называемая «Card», которая имеет отношение «info» к другой сущности, «CardInfo».Это отношение один ко многим: у каждой карты может быть несколько CardInfos, но у каждой CardInfo есть только одна Card.

У сущности CardInfo просто есть две строки, «cardKey» и «cardValue».Цель состоит в том, чтобы обеспечить произвольный ввод данных для карточек.Скажем, вы хотели знать, какого цвета карта.Затем вы добавили CardInfo к каждой Карте, у которой есть cardKey «color» и cardValue «black» или «red».

Мой общий вопрос: каков наилучший способ получить набор карт, есликаждая карта имеет CardInfo, где CardKey и CardValue имеют определенные значения.Например: все карты, имеющие отношение к CardInfo cardKey = 'color' и cardValue = 'red'?В идеале я возвращаю NSSet всех соответствующих объектов Card *.

Ответы [ 2 ]

2 голосов
/ 26 августа 2010

Цикл в конце не нужен. Простой вызов 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"];
0 голосов
/ 26 августа 2010

Это ответ, который я придумал, но процесс, состоящий из двух частей, кажется мне неэффективным. Я полагаю, что должен быть более элегантный способ сделать это с помощью значений ключа или чего-то еще

-(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];
}
...