2010-12-22 20 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'も使用していますが、これも問題です。 –

+2

また、データキーパスで@countを使用してカウントを取得することもできます。中間部分を反復処理する必要はありません – Nevin

+0

Nevin、ここでキー値収集演算子を使用して正確にカウントを取得できますか? – shawnwall

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のようにCore Dataについて嫌いなことの1つです。

関連する問題