2010-12-22 163 views
2

我有三个型号:核心数据:计数跨越关系

+----------+  +--------------+  +------+ 
| 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:请注意,我是生成不同的结果,在这里,没有直接获取模型。我假设我不得不运行另一个请求来获取这些信息,但如果可能不这样做,那会更好。

谢谢!

回答

0
+0

没错,但我正在经历另一段关系。我是否需要手动遍历`GiftOccasion`并将每个`Gift`的计数加起来?实际上没有更好的方法吗?另外,我正在使用`setReturnsDistinctResults:YES`,这也是一个问题。 – 2010-12-23 02:11:33

0

这不是一个很好的答案,而我不会选择它作为“正确”的答案,但我最终做了一个荒唐的组嵌套NSEnumerator s表示通过走每个关系,并最终做了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之间的关系之一。