核心数据结果分组

时间:2016-09-20 11:37:37

标签: ios sql core-data group-by

我正在使用核心数据,一般来说,我有一个游戏,一个游戏阶段,以及针对不同类型的行动得分的分数(比如说pointA,pointsB)

每个游戏包含两个阶段,因此每个玩家每个阶段的总分数,然后每个游戏(阶段1 +阶段2)

我的得分核心数据中的实体有:

  1. 玩家(与玩家的关系),
  2. 游戏(与游戏的关系),
  3. 阶段(属性),
  4. PointsA (属性),
  5. PointsB (属性)。
  6. 因此每个玩家都有一个游戏阶段的分数记录。

    为了获取给定玩家的所有积分按游戏聚合(因此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];
    

    我的问题是:假设我有 MANY MORE POINTS TYPES ,如 pointsC PointsD 等。(让我们说得分为更多不同类型的行动)。我是否必须为所有这些使用 SEPARATE NSExpressionDescription(例如上面的ex和ex2)?

    这真的在Core Data中啰嗦多久了?有更快的方法吗?

    我对Core Data相对较新。

    对于那些想知道如何解析结果集的人:

    for (id Res  in results) {
    
        NSLog(@"pointsA: %@   ", Res[@"pointsA"] );
        NSLog(@"pointsB: %@   ", [Res valueForKey:@"pointsB"] );
        //both work
    }
    

1 个答案:

答案 0 :(得分:1)

好的,回答我自己的问题:我想更优雅的方式是使用Core Data属性名称输入一系列项目,然后可以根据需要进行:

(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] ;

}

不确定性能/内存后果是什么?