分组核心数据对象

时间:2011-02-25 13:38:55

标签: iphone objective-c cocoa core-data

我有一个核心数据实体,其create_at属性是NSDate,而amount属性是NSInteger。

我想提出一个请求,该请求返回按月分组的金额总和。类似的东西:

[['February 2010', 450], ['January 2010', 300]]

我不知道如何处理这个问题,如果我必须首先获取特定日期范围的所有结果,然后计算总和,或者是否有其他方法。

P.S。我在iphone 4.2 sdk上做这个。

2 个答案:

答案 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)

我会将您感兴趣的对象范围提取到一个数组中,然后枚举该数组并随时添加所有金额。

我不确定这是否可以通过创建复杂的请求来解决,但我的直觉告诉我,无论如何设置都是棘手的(如果可能的话)......