Основные данные: рассчитывать на отношения - PullRequest
2 голосов
/ 23 декабря 2010

У меня есть три модели:

+----------+        +--------------+        +------+
| Occasion | <--->> | GiftOccasion | <--->> | Gift |
+----------+        +--------------+        +------+

Я хотел бы получить название события и подсчет всех подарков, которые соответствуют определенным критериям. В настоящее время я получаю четкий список случаев, отсортированных по году и названию:

NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request retain];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Occasion" inManagedObjectContext:[self managedObjectContext]];
[request setEntity:entity];
[request setResultType:NSDictionaryResultType];

[request setPropertiesToFetch:[NSArray arrayWithObjects:@"name", @"year", nil]];    
[request setReturnsDistinctResults:YES];

NSSortDescriptor *yearDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"year" ascending:NO selector: @selector(caseInsensitiveCompare:)] autorelease];
NSSortDescriptor *nameDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES selector: @selector(caseInsensitiveCompare:)] autorelease];
NSArray *descriptors = [NSArray arrayWithObjects:yearDescriptor, nameDescriptor, nil];
[request setSortDescriptors:descriptors];

NSError *error = nil;
NSArray *results = [[self managedObjectContext] executeFetchRequest:request error:&error];  

... но я в полном недоумении от того, как получить счет Gift. Есть ли прямой путь, или мне нужно пройти через все GiftOccasion и связанные Gift и сложить все вместе?

ETA: обратите внимание, что я выдаю отличные результаты , здесь, не получаю модель напрямую. Я предполагаю, что мне нужно будет выполнить еще один запрос, чтобы получить эту информацию, но если это невозможно, это было бы лучше.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 24 декабря 2010

Это не очень хороший ответ, и я не собираюсь выбирать его в качестве «правильного» ответа, но в итоге я получил смешной набор вложенных NSEnumerator, которые проходят через каждое отношение и в конечном итогесделать count += 1;, что-то вроде этого:

    NSUInteger giftCount = 0;


    NSEnumerator *oEnum = [resultsList objectEnumerator];
    Occasion *occasion = nil;
    while (occasion = [oEnum nextObject]) {

        NSEnumerator *goEnum = [occasion.giftOccasions objectEnumerator];
        GiftOccasion *go;

        while (go = [goEnum nextObject]) {
            if (go.gifts) {

                NSEnumerator *giftEnum = [go.gifts objectEnumerator];
                Gift *gift = nil;
                while (gift = [giftEnum nextObject]) {
                    NSLog(@"Gift: %@ %@", gift.name, gift.purchased);
                    if ([gift.purchased boolValue] == NO) {
                        giftCount += 1;
                    }
                }
            }
        }
    }

смущает, но это работает.:-)

Если есть лучший, более эффективный способ сделать это, я хотел бы услышать это.Это одна из вещей, которые мне не нравятся в Core Data как в ORM, скажем, в ActiveRecord.

0 голосов
/ 23 декабря 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...