核心数据总和关系

时间:2011-02-28 18:03:39

标签: iphone objective-c core-data

我有一个有很多费用的类别实体。我想得到一个月内某个类别所有费用的总和:

- (NSNumber *)totalForMonth:(NSDate *)date { ...

NSPredicate *sumPredicate = [NSPredicate predicateWithFormat:@"(ANY %@ <= expenses.created_at) AND (ANY expenses.created_at <= %@)",
                             [date beginningOfMonth], [date endOfMonth]];

NSFetchRequest *req = [[[NSFetchRequest alloc] init] autorelease];
[req setPredicate:sumPredicate];
[req setEntity:entity];

NSError *error;
NSArray *fetchedObjects = [managedObjectContext executeFetchRequest:req error:&error];

return [fetchedObjects valueForKeyPath:@"expenses.@sum.amount"];

}

NSPredicate *sumPredicate = [NSPredicate predicateWithFormat:@"(ANY %@ <= expenses.created_at) AND (ANY expenses.created_at <= %@)", [date beginningOfMonth], [date endOfMonth]]; NSFetchRequest *req = [[[NSFetchRequest alloc] init] autorelease]; [req setPredicate:sumPredicate]; [req setEntity:entity]; NSError *error; NSArray *fetchedObjects = [managedObjectContext executeFetchRequest:req error:&error]; return [fetchedObjects valueForKeyPath:@"expenses.@sum.amount"];

这段代码的问题在于它会引发异常,因为显然这不是在关系中使用@sum的方式。

2 个答案:

答案 0 :(得分:1)

您可能需要为其创建自定义getter,并从那里访问它。

即。

<强> Category.h

@property (nonatomic, readonly) NSNumber* expensesSum;    

<强> Category.m

-(NSNumber*) expensesSum
{
    return [self valueForKeyPath:@"expenses.@sum.amount"];
}

此外,当请求返回我认为的子对象数组时,您当前正在返回NSNumber *

答案 1 :(得分:1)

您使用正确语法的@sum。最有可能的是,你刚刚得到了另一部分密钥错误,例如: “费用”而不是“费用”。或者,您可能正在获取错误的实体。

如果您只想获取此总和,请执行属性提取并将返回类型设置为字典。 (有关详细信息,请参阅NSFetchRequest和核心数据编程指南)文档。返回一个字典数组,其唯一键是属性名称,其唯一值是一个托管对象的selected属性值。它比获取完整对象更快,使用的资源更少。