我使用的是 Core Data,一般来说,我有一个游戏、一个游戏阶段和针对不同类型的 Action 得分(比如点 A、点 B)。
每场比赛由两个阶段组成,因此每个玩家每个阶段都有一个总分,然后是每场比赛(第 1 阶段 + 第 2 阶段)。
我在核心数据中的分数实体有:
- 玩家(与玩家的关系),
- 游戏(与游戏的关系),
- 阶段(属性),
- PointsA(属性),
- 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];
我的问题是:假设我有更多的点类型,如pointsC、PointsD 等。(比方说分数更多不同种类的 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/