2016-09-20 19 views
1

私はコアデータを使用していますが、一般的には、ゲーム、ゲームフェーズを持ち、さまざまな種類のアクションに対して点数を付けました(pointsA、pointsBと言うことができます)コアデータの結果をグループ化する

各ゲームは2つのフェーズで構成されているため、1プレイヤーごとにゲームごとに合計ポイントが得られます。(フェーズ1 +フェーズ2)

マイ コアデータにエンティティをスコアすることがあります。

  1. プレーヤー(プレイヤーとの関係)、
  2. ゲーム(リレーションシップゲームへ)、
  3. フェーズ(属性) 、
  4. 点A(属性)、
  5. ポイントB(属性)。

各プレイヤーはゲームのフェーズでスコアの記録を持っています。

与えられたプレーヤーのすべてのポイントを取得するにはゲームによって集計されます( "Group By"に相当するSQL)。私はこのコードを使用して管理し、ITは WORKS:

CODE:

NSError *error; 
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 

fetchRequest.entity = [NSEntityDescription entityForName:@"Score" inManagedObjectContext:self.managedObjectContext]; 

fetchRequest.predicate=[NSPredicate predicateWithFormat:@"player == %@",_currentPlayer]; 

NSExpressionDescription* ex = [[NSExpressionDescription alloc] init]; 
[ex setExpression:[NSExpression expressionWithFormat:@"@sum.pointsA"]]; 
[ex setExpressionResultType:NSDecimalAttributeType]; 
[ex setName:@"pointsA"]; 

NSExpressionDescription* ex2 = [[NSExpressionDescription alloc] init]; 
[ex2 setExpression:[NSExpression expressionWithFormat:@"@sum.pointsB"]]; 
[ex2 setExpressionResultType:NSDecimalAttributeType]; 
[ex2 setName:@"pointsB"]; 

[fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:@"Game",ex, ex2,nil]]; 

[fetchRequest setPropertiesToGroupBy:[NSArray arrayWithObjects:@"Game",nil]]; 
[fetchRequest setResultType:NSDictionaryResultType ]; 

results= [self.managedObjectContext executeFetchRequest:fetchRequest error:&error]; 

私の質問です:私はpointsC、PointsDのように、MANY MORE POINTSタイプを持っていると仮定(他にもいろいろな種類の行動のスコアを挙げましょう)。これらのすべてについて、の別名NSExpressionDescription(上記とex2)を使用する必要がありますか?

これは本当にそれがコアデータにどれくらい巻き込まれていますか?より速い方法がありますか?

私はコアデータに比較的新しいです。結果セットを解析する方法を不思議に思っている人のために

for (id Res in results) { 

    NSLog(@"pointsA: %@ ", Res[@"pointsA"]); 
    NSLog(@"pointsB: %@ ", [Res valueForKey:@"pointsB"]); 
    //both work 
} 

答えて

1

OK、自分の質問に答える:私はもっとエレガントな方法は、コアデータと項目の配列に送り込むことであろうと思いますあなたが必要とする場合は、あなたが望む限り長くすることができます:

(NSArray *)項目は、pointsA、pointsB、pointsC、pointsD、zまでのすべての方法を含みます。

/// ///コード

-(void)fetchRes:(NSArray*)items 
{ 
    NSError *error; 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 

    fetchRequest.entity = [NSEntityDescription entityForName:@"Score" inManagedObjectContext:self.managedObjectContext]; 

    fetchRequest.predicate=[NSPredicate predicateWithFormat:@"player == %@",_currentPlayer]; 

    NSMutableArray *propsArray=[[NSMutableArray alloc]initWithObjects:@"Game", nil]; 

    for (int i=0;i<items.count;i++) 

    { 
     NSString *desc=[[NSString alloc]initWithFormat:@"@sum.%@",items[i]]; 

     NSExpressionDescription* ex3 = [[NSExpressionDescription alloc] init]; 
     [ex3 setExpression:[NSExpression expressionWithFormat:desc]]; 
     [ex3 setExpressionResultType:NSDecimalAttributeType]; 
     [ex3 setName:items[i]]; 

     [propsArray insertObject:ex3 atIndex:i+1]; 
    } 

    [fetchRequest setPropertiesToFetch:propsArray]; 

    [fetchRequest setPropertiesToGroupBy:[NSArray arrayWithObjects:@"Game",nil]]; 
    [fetchRequest setResultType:NSDictionaryResultType ]; 

    results=[self.managedObjectContext executeFetchRequest:fetchRequest error:&error] ; 

} 

ないパフォーマンス/メモリへの影響が何であるかを確認してください?

関連する問題