核心数据:跨越关系

时间:2010-12-22 22:29:26

标签: objective-c core-data ios

我有三种模式:

+----------+        +--------------+        +------+
| 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 :(得分:0)

答案 1 :(得分:0)

这不是一个好的答案,我不打算选择它作为“正确”的答案,但我最终做的是一套荒谬的嵌套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;
                    }
                }
            }
        }
    }

令人尴尬,但它确实有效。 :-)

如果有更好,更有效的方法来做到这一点,我很乐意听到它。这是我不喜欢核心数据作为ORM与ActiveRecord相比的事情之一。