我有一个核心数据实体,其create_at属性是NSDate,而amount属性是NSInteger。
我想提出一个请求,该请求返回按月分组的金额总和。类似的东西:
[['February 2010', 450], ['January 2010', 300]]
我不知道如何处理这个问题,如果我必须首先获取特定日期范围的所有结果,然后计算总和,或者是否有其他方法。
P.S。我在iphone 4.2 sdk上做这个。
答案 0 :(得分:2)
即使已经接受了答案,我也可以添加这种更复杂,更快捷的完整方法。
假设未在数据模型中建模月份,则需要在每个月中获取对象,然后对金额求和。根据需要重复多个月。
因此,第一步是为fetch创建变量谓词。像这样:
NSPredicate * exPred = [NSPredicate predicateWithFormat:@“%@< = created_at< =%@”,monthStartDate,monthEndDate];
NSPredicate *exPred=[NSPredicate predicateWithFormat:@"(%@<=created_at) AND (created_at<=%@)", monthStartDate,monthEndDate];
...然后执行fetch并对return返回:
NSNumber * theSum = [@ sum。[context executeFetchRequest:theFetch error:&amp; error] .amount];
......或者更少的牛仔:
NSArray *fetchedObjects=[context executeFetchRequest:theFetch error:&error];
// if no error
NSNumber *theSum=[fetchedObjects valueForKeyPath:@"@sum.amount"];
将它放在每个月的循环中。
谓词和集合操作比循环快得多。尽可能使用它们而不是循环。
答案 1 :(得分:0)
我会将您感兴趣的对象范围提取到一个数组中,然后枚举该数组并随时添加所有金额。
我不确定这是否可以通过创建复杂的请求来解决,但我的直觉告诉我,无论如何设置都是棘手的(如果可能的话)......