核心数据总和关系

Osc*_*Ben 5 iphone core-data objective-c

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

- (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"];
Run Code Online (Sandbox Code Playgroud)

}

- (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"];
Run Code Online (Sandbox Code Playgroud)

}

这段代码的问题在于它抛出异常,因为显然这不是在关系上使用@sum的方法.

Tec*_*Zen 1

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

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