ios - 核心数据结果分组依据

标签 ios sql core-data group-by

我使用的是 Core Data,一般来说,我有一个游戏、一个游戏阶段和针对不同类型的 Action 得分(比如点 A、点 B)

每场比赛由两个阶段组成,因此每个玩家每个阶段都有一个总分,然后是每场比赛(第 1 阶段 + 第 2 阶段)

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

  1. 玩家(与玩家的关系),
  2. 游戏(与游戏的关系),
  3. 阶段(属性),
  4. PointsA(属性),
  5. PointsB(属性)。

因此每个玩家在游戏的某个阶段都有一个得分记录。

为了获取给定玩家的所有分数按游戏聚合(因此 SQL 相当于“分组依据”)。我设法使用了这段代码并且它工作:

代码:

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

我的问题是:假设我有更多的点类型,如pointsCPointsD 等。(比方说分数更多不同种类的 Action )。我是否必须为所有这些使用SEPARATE NSExpressionDescription(上面的 ex 和 ex2)?

这真的是 Core Data 的冗长吗?有没有更快的方法?

我对 Core Data 比较陌生。

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

for (id Res  in results) {

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

最佳答案

好的,回答我自己的问题:我想一个更优雅的方法是输入一个带有 Core Data 属性名称的项目数组,然后可以根据需要设置长度:

(NSArray*)items 包含 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] ;

}

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

关于ios - 核心数据结果分组依据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39593053/

相关文章:

ios - 如何调暗父 UIView(50% 透明)以进行登录?

SQL Server 2012 : how to get count group by from multiple table joins

ios - Core Data 无法在 IOS Objective - C 中保存 UITextField 的数据

objective-c - 如何使所有 Core Data 对象继承 self 的类而不是 NSManagedObject?

ios - 在 iOS 应用程序中从 MySQL 加载数据

ios - 'NSInternalInconsistencyException' 使用 Collection View Swift 3 插入项目

ios - [UITableViewCell menuImage]:无法识别的选择器已发送到实例0x10bb1e5e0

sql - 找不到类型 'tSQLt.Private'

SELECT 上的 MySQL 更新

swift - 更新核心数据对象顺序 - 不工作