2016-04-25 97 views
0

我有一個具有「金額」屬性和「日期」屬性的實體。我有許多這些實體,一天中有多個。我想提供每日平均的金額,例如在一個月的時間內。使用核心數據彙總每日平均數,移動平均數

我明白如何使用集合函數來獲得一天的金額的平均值。但我不明白如何返回數據集中所有日期的每日平均值列表。

看起來好像有一個比每天創建提取請求更好的方法?也許我必須以某種方式利用子查詢?

(相關,但不同,我也想計算一個移動平均數,這樣我可以返回,比如20天移動平均數量,在這種情況下,一個平均值列表,這是當天的20天平均值)

回答

0

核心數據不是數據庫。您可以在數據庫中執行某些操作,您需要在Core Data中編寫代碼(技術上,您還需要在數據庫中編寫代碼)。這是您需要編寫代碼的情況。

因此,您可以每天獲取並讓商店計算平均值,或者您可以檢索所有您感興趣的數據並在內存中執行日常平均值。

每天做一次抓取的代碼會少一些,但是會比較慢,因爲每天需要打一次商店。

在內存中執行一次提取和計算會更快,但會佔用更多代碼。

就我個人而言,我會從商店獲取所有相關數據,然後遍歷謂詞並讓謂詞計算每天的平均值。

+0

嗨馬庫斯。謝謝你的評論。看起來你在覈心數據方面有很多經驗,所以如果你看到我發佈的答案和評論,如果你看到問題,我會很感激。 – user903309

+0

它工作嗎?如果是這樣,那麼你不需要我的確認:)因爲你可以調整數據模型和輸入數據,所以你比原來隱含的問題具有更大的靈活性,並且你找到了一個更清晰的解決方案。做得好 :) –

0

因此,它似乎與數據集稍有變化,這確實是可能的。但是,至少對於這個解決方案來說,你需要負責你的數據集。

我添加了一個屬性「dateDay」,它是一個int,表示從我的實體中的錨定日期到「date」屬性的天數。 (請參閱Number of days between two NSDates

然後,您按「dateDay」進行分組並使用「average:」NSExpression。使用groupBy時,NSExpression聚合在組上運行。

NSExpression* ex = [NSExpression expressionWithFormat:@"average:(amount)"]; 
NSExpressionDescription* ed = [[NSExpressionDescription alloc] init]; 
ed.name = @"result"; 
ed.expression = ex; 
ed.expressionResultType = NSInteger32AttributeType; 

NSFetchRequest* request = [[NSFetchRequest alloc] initWithEntityName:@"Transaction"]; 
request.resultType = NSDictionaryResultType; 
request.propertiesToFetch = @[@"dateDay", ed]; 
request.propertiesToGroupBy = @[@"dateDay"]; 

NSError  * error    = nil; 
NSArray  * resultsArray  = [context executeFetchRequest:request error:&error]; 

雖然propertiesToGroupBy在案,以採取NSExpression,它似乎無法進行計算,所以傳遞一個NSExpression減少的NSDate成能在不工作進行分組的組件。因此需要額外的屬性。