我仍在努力将自己的注意力集中在Core Data上,并且在释放SQL方面遇到了麻烦。我知道它们并不相同,但是我发现很难重新创建可以在SQL中执行的操作。我希望有人能提供帮助。
我要做的是创建客户列表并返回其当前账单的总和。我有两个实体:
客户
开票
我在两个实体之间创建了一对多关系,并且我的NSEntityDescription指向客户端。
现在我想用SQL术语进行的是这样的:
SELECT *, SUM(amount) as Total FROM Clients INNER JOIN Billing......"
@"[email protected]"
吗? 最佳答案
可以使用一个提取请求完成此操作,还是可以执行2个请求然后合并它们?
是的,可以通过一个请求完成。 see here
/*UNTESTED*/
- (NSNumber*) billingSumForClient:(NSManagedObjectID*)clientId
context:(NSManagedObjectContext*)context
{
NSNumber* total = nil;
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Billing"];
[request setResultType:NSDictionaryResultType];
NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:@"amount"];
NSExpression *sumExpression = [NSExpression expressionForFunction:@"sum:"
arguments:[NSArray arrayWithObject:keyPathExpression]];
NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init];
[expressionDescription setName:@"total"];
[expressionDescription setExpression:sumExpression];
[expressionDescription setExpressionResultType:NSDateAttributeType];
[request setPredicate:[NSPredicate predicateWithFormat:@"client == %@",clientId]];
[request setPropertiesToFetch:[NSArray arrayWithObject:expressionDescription]];
NSError *error = nil;
NSArray *objects = [context executeFetchRequest:request error:&error];
if (&error) {
// Handle the error.
} else {
if ([objects count] > 0) {
total = [[objects objectAtIndex:0] valueForKey:@"total"];
}
}
return total;
}
我可以以某种方式使用valueForKey:@“billing。@ sum.amount”吗?
是。 see here(@Daniel link)
如果您的所有帐单都已经错入您当前的上下文,这可能会更快。
关于ios - 核心数据查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16068276/