核心数据查询
Posted
技术标签:
【中文标题】核心数据查询【英文标题】: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......"
我可以使用 valueForKey:@"billing.@sum.amount"
吗?
还有谁能推荐一本适合初学者、中级水平的优秀 Core Data 书籍(或网站)?
【问题讨论】:
Core Data 中没有内连接之类的东西。但至少它们有聚合函数:brianflove.com/2012/09/26/core-data-aggregate-functions Core Data get sum of values. Fetched properties vs. propagation的可能重复 我了解核心数据中没有联接。我查看了您提供的链接,但我仍然感到困惑。父实体不能从子实体检索任何信息,反之亦然?还是我需要创建另一个 Fetch Request 来获取客户账单的总和?Client
实体是否具有指向Billing
的反向关系?因为如果不是,它应该。
是的。这有帮助吗?
【参考方案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 个请求。获取客户信息以填充我的表格然后提供总数的原始信息。以上是关于核心数据查询的主要内容,如果未能解决你的问题,请参考以下文章