2011-02-28 97 views
5

我有一個類別實體有很多費用。我想所有的費用爲一個類別和在特定的月份:關係中的核心數據總和

- (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:@"[email protected]"]; 

}

這段代碼的問題是,它拋出一個異常,因爲顯然這並不是一個關係使用@sum方式。

+0

我也想知道這個答案,因爲我正在閱讀蘋果的文檔,它似乎從來沒有做它應該做的。我通過總結子活動的持續時間來得出一個活動的持續時間,它給了我同樣的例外。 – horseshoe7 2013-01-28 18:46:16

回答

1

您以正確的語法使用@sum。很可能,您剛剛獲得了另一部分keypath錯誤,例如「費用」而不是「費用」。或者,您可能正在獲取錯誤的實體。

如果您只想獲取此金額,請執行屬性提取並將您的返回類型設置爲字典。 (詳見NSFetchRequest和Core Data Programming Guide)文檔。這將返回一組字典,其唯一鍵是屬性名稱,其唯一值是一個管理對象的選定屬性的值。速度更快,使用資源少於獲取完整對象的資源。

+0

他不只是想得到所有費用的總和,而且還希望得到他使用的特定謂詞(即給定範圍之間的日期)的總和。因此,一個簡單的吸氣器不會爲他工作。 – strange 2011-09-26 20:08:32

+0

他沒有將集合運算符應用於獲取謂詞,而是應用於由提取返回的對象數組。因此,他有他想要總結的物體。只要keypath是正確的'valueForKeyPath:'不關心對象來自哪裏。 – TechZen 2011-09-27 22:34:32

1

您可能需要爲它創建一個自定義getter,並從那裏訪問它。

Category.h

@property (nonatomic, readonly) NSNumber* expensesSum;  

Category.m

-(NSNumber*) expensesSum 
{ 
    return [self valueForKeyPath:@"[email protected]"]; 
} 

此外,您目前返回NSNumber *當請求返回兒童對象的數組我相信。

+0

我添加了該屬性,並將我的方法的最後一行更改爲:return [fetchedObjects valueForKeyPath:@「expensesSum」];但現在我得到:實體類別不是關鍵字「費用。@ sum.amount」的關鍵值編碼。 – 2011-02-28 19:18:41

+0

您是否找到了解決方案? – strange 2011-09-26 20:07:28