核心数据查询

时间:2013-04-17 19:14:14

标签: ios core-data nsfetchrequest

我仍然试图绕过Core Data并且在放弃SQL方面遇到了麻烦。我知道它们不一样,但我发现很难重新创建我在SQL中可以做的事情。我希望有人可以提供帮助。

我想要做的是创建一个客户列表并返回其当前账单的总和。我有两个实体:

客户端

  • 名称
  • 地址

结算

  • 客户端
  • 日期
  • 金额

我在2个实体之间创建了一对多的关系,并让我的NSEntityDescription指向客户端。

现在我想用SQL术语发生的是:

SELECT *, SUM(amount) as Total FROM Clients INNER JOIN Billing......"

  • 这可以通过一个获取请求完成,还是我可以执行2个请求然后合并它们?
  • 我可以以某种方式使用valueForKey:@"billing.@sum.amount"吗?

  • 也有人可以为初学者,中级水平推荐一本优秀的核心数据书(或网站)吗?

1 个答案:

答案 0 :(得分:0)

  
    

这可以通过一个获取请求完成,还是我可以执行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:@"结算。@ sum.amount"?

  

是。 see here(@Daniel link)
如果您的所有账单已经出现在您当前的背景中,这可能会更快。