我正在使用核心数据,一般来说,我有一个游戏,一个游戏阶段,以及针对不同类型的行动得分的分数(比如说pointA,pointsB)。
每个游戏包含两个阶段,因此每个玩家每个阶段的总分数,然后每个游戏(阶段1 +阶段2)。
我的得分核心数据中的实体有:
因此每个玩家都有一个游戏阶段的分数记录。
为了获取给定玩家的所有积分按游戏聚合(因此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
}
答案 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] ;
}
不确定性能/内存后果是什么?