我对Core Data有一个特定但非常常见的任务,答案找不到。 假设我们有收入的CoreData模型。它每天都充满了未知数量的记录。 任务是在一段时间内显示收入情节。 所以,我必须做的是计算当天的总收入并显示情节。
我知道如何总结一段时间:
NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:@"income"];
NSExpression *expression = [NSExpression expressionForFunction:@"sum:" arguments:@[keyPathExpression]];
NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init];
[expressionDescription setName:@"result"];
[expressionDescription setExpression:expression];
[expressionDescription setExpressionResultType:NSDoubleAttributeType];
NSFetchRequest *fetchRequest = <#create fetch request#>;
[fetchRequest setResultType:NSDictionaryResultType];
[fetchRequest setPropertiesToFetch:@[expressionDescription]];
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"date >= %@ && date <= %@", startDate, endDate,];
[fetchRequest setPredicate:predicate];
如果我创建NSCompoundPredicate,它只是对所有字段求和,并且响应包含一个总和。
我如何在每个时间段执行它并进入一次响应?
谢谢
答案 0 :(得分:0)
一种经过验证的方法是使用NSFetchedResultsController
的部分功能。您必须以某种方式保留当天的信息才能正常工作,但Apple提供了一些易于使用的示例代码。
然后,您将使用section info协议的objects
方法来寻址您想要的对象。使用KVC,计算总和(没有涉及的表达式语法)非常容易(而且很优雅)。
NSNumber *sum = [[sectionInfo objects] valueForKeyPath:@"@sum.income"];
如果您担心效率 - 请不要担心。这将在主线程上没有滞后,接近100.000s记录。获取的结果控制器将在后台确保考虑内存和CPU约束。