2010-12-22 156 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之間的關係之一。