【问题标题】:Core Data Queries核心数据查询
【发布时间】:2013-04-17 19:14:13
【问题描述】:

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

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

客户

  • 姓名
  • 地址

计费

  • 客户
  • 日期
  • 金额

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

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

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

  • 这可以通过一个 Fetch Request 来完成,还是我会做 2 个 Request 然后合并它们?
  • 我可以使用 valueForKey:@"billing.@sum.amount" 吗?

  • 还有谁能推荐一本适合初学者、中级水平的优秀 Core Data 书籍(或网站)?

【问题讨论】:

标签: ios core-data nsfetchrequest


【解决方案1】:

这可以用一个 Fetch Request 完成,还是我会做 2 个 Request 然后合并它们?

是的,只需一个请求即可完成。 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)
如果您的所有帐单都已在您当前的上下文中出错,这可能会更快。

【讨论】:

  • 谢谢丹。然后我将不得不使用 2 个请求。获取客户信息以填充我的表格然后提供总数的原始信息。
猜你喜欢
  • 2012-06-15
  • 1970-01-01
  • 1970-01-01
  • 2013-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多