【问题标题】:Core Data sum in relationship关系中的核心数据总和
【发布时间】:2011-02-28 18:03:38
【问题描述】:

我有一个有很多费用的类别实体。我想获取给定月份某个类别的所有费用总和:

- (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"];

}

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

【问题讨论】:

  • 我也想知道这个问题的答案,因为我正在阅读 Apple 的文档,但它似乎从来没有按照它的建议去做。我通过对子活动的持续时间求和来得出活动的持续时间,这给了我同样的例外。

标签: iphone objective-c core-data


【解决方案1】:

您以正确的语法使用@sum。很可能,您刚刚弄错了密钥路径的另一部分,例如“费用”而不是“费用”。或者,您可能正在获取错误的实体。

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

【讨论】:

  • 他不仅想获得所有费用的总和,还想获得他正在使用的特定谓词(即给定范围之间的日期)的总和。因此,一个简单的 getter 对他不起作用。
  • 他没有将集合运算符应用于 fetch 谓词,而是应用于 fetch 返回的对象数组。因此,他有他想要总结的对象。只要 keypath 正确valueForKeyPath: 不在乎对象来自哪里。
【解决方案2】:

您可能需要为它创建一个自定义 getter,然后从那里访问它。

Category.h

@property (nonatomic, readonly) NSNumber* expensesSum;    

Category.m

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

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

【讨论】:

  • 我添加了该属性并将方法的最后一行更改为:return [fetchedObjects valueForKeyPath:@"expensesSum"];但现在我得到了:实体类别与键“expenses.@sum.amount”的键值编码不兼容。
  • 您找到解决方案了吗?
猜你喜欢
  • 2013-05-03
  • 1970-01-01
  • 1970-01-01
  • 2014-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多