【问题标题】:Core Data: Count across relationships核心数据:跨关系计数
【发布时间】:2010-12-22 22:29:25
【问题描述】:

我有三个模型:

+----------+        +--------------+        +------+
| 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 和相关的Gifts 并将它们加在一起?

ETA:请注意,我在这里生成不同的结果,而不是直接获取模型。我假设我必须运行另一个请求才能获取此信息,但如果可以不这样做,那就更好了。

谢谢!

【问题讨论】:

    标签: objective-c core-data ios


    【解决方案1】:

    【讨论】:

    • 对,但我正在经历另一个关系。我是否需要手动遍历 GiftOccasion 并为每个添加 Gift 的计数?实际上没有更好的方法吗?另外,我正在使用setReturnsDistinctResults:YES,这也是一个问题。
    • 您也可以使用@count 和数据键路径来获取计数。那么你不需要遍历中间部分
    • Nevin,我们如何在这里使用键值集合运算符来获取计数?
    【解决方案2】:

    这不是一个好的答案,我不会选择它作为“正确”答案,但我最终做的是一组荒谬的嵌套NSEnumerators,它们会遍历每个关系并最终做一个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 相比的原因之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多