使用核心數據時,我遇到了一個問題。我有一個具有「金額」屬性的實體「運動」。我如何製作所有實例的「金額」的總和?我想了解如何使用NSExpressionDescription,但它足夠好NSSet。核心數據所有實例的總和屬性
回答
有一個managedObjectContext:
NSManagedObjectContext *managedObjectContext = ...
我們創建返回類型的字典爲獲取請求:
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass([Movement class])];
fetchRequest.resultType = NSDictionaryResultType;
然後我們創建一個表達式描述來計算的總和:
NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init];
expressionDescription.name = @"sumOfAmounts";
expressionDescription.expression = [NSExpression expressionForKeyPath:@"@sum.amount"];
expressionDescription.expressionResultType = NSDecimalAttributeType;
設置請求屬性以獲取:
fetchRequest.propertiesToFetch = @[expressionDescription];
如果需要,我們也可以設置謂詞。
最後我們執行請求並獲取一個包含帶有一個鍵(@「sumOfAmounts」)的字典的數組,它的值是一個具有金額總和的NSNumber。
NSError *error = nil;
NSArray *result = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
if (result == nil)
{
NSLog(@"Error: %@", error);
}
else
{
NSNumber *sumOfAmounts = [[result objectAtIndex:0] objectForKey:@"sumOfAmounts"];
}
乾杯
最好的辦法是使用一個fetch for specific values並提供一個NSExpressionDescription with a sum:
function.
當執行你得到含有詞典,其關鍵字匹配表達式的描述和其值表達式的結果的一個元件陣列的取。在這種情況下,您將得到sum
鍵,其值將是給定表達式的屬性的總和。
下面是使用NSExpression
和NSExpressionDescription
總結被管理對象的屬性的斯威夫特例子。該示例假定被管理對象被命名爲Movement
並且總和屬性爲amount
。
實施例:
func sumAmount -> Double {
var amountTotal : Double = 0
// Step 1:
// - Create the summing expression on the amount attribute.
// - Name the expression result as 'amountTotal'.
// - Assign the expression result data type as a Double.
let expression = NSExpressionDescription()
expression.expression = NSExpression(forFunction: "sum:", arguments:[NSExpression(forKeyPath: "amount")])
expression.name = "amountTotal";
expression.expressionResultType = NSAttributeType.DoubleAttributeType
// Step 2:
// - Create the fetch request for the Movement entity.
// - Indicate that the fetched properties are those that were
// described in `expression`.
// - Indicate that the result type is a dictionary.
let fetchRequest = NSFetchRequest(entityName: "Movement")
fetchRequest.propertiesToFetch = [expression]
fetchRequest.resultType = NSAttributeType.DictionaryResultType
// Step 3:
// - Execute the fetch request which returns an array.
// - There will only be one result. Get the first array
// element and assign to 'resultMap'.
// - The summed amount value is in the dictionary as
// 'amountTotal'. This will be summed value.
do {
let results = try context.executeFetchRequest(fetchRequest)
let resultMap = results[0] as! [String:Double]
amountTotal = resultMap["amountTotal"]!
} catch let error as NSError {
NSLog("Error when summing amounts: \(error.localizedDescription)")
}
return amountTotal
}
步驟的另外的討論:
步驟1 - 創建NSExpressionDescription
變量。這個NSExpressionDescription
指示對參數應用什麼類型的函數。 總和功能正在應用於數量屬性。
expression.expression = NSExpression(forFunction: "sum:",
arguments:[NSExpression(forKeyPath: "amount")])
注意,參數參數是一個陣列。您可以在數組中傳遞不同類型的表達式,但在我們的情況下,我們只需要amount
屬性。
步驟2 - 在此處建立獲取請求。請注意,結果類型被指定爲字典:fetchRequest.resultType = NSAttributeType.DictionaryResultType
。在步驟3中,我們將使用的expression.name
值作爲訪問總和值的關鍵。
第3步 - 我們執行獲取請求並返回將是一個元素數組。該元素將是我們種類爲[String:Double]
:let resultMap = results[0] as! [String:Double]
的字典。該字典的值是Double,因爲在步驟1中我們指出expression.expressionResultType
將是Double。
最後,我們通過調用與amountTotal
鍵關聯的字典訪問值的總和:resultMap["amountTotal"]!
參考文獻:
- 1. 核心數據:實體屬性混合
- 2. 多核心數據實例
- 3. 具有NSData屬性的核心數據
- 4. 核心數據兩個日期之間的實體屬性的總和
- 5. 核心數據集屬性
- 6. Xcode核心數據屬性
- 7. 核心數據和瞬態屬性
- 8. 核心數據:獲取所有實體
- 9. 具有指向對象的屬性的核心數據實體
- 10. 核心數據獲取的實體,只有獨特的屬性
- 11. 如何獲取核心數據中屬性的所有值?
- 12. 核心數據 - 嘗試預取所有行的屬性很慢
- 13. 刪除具有屬性值的特定核心數據實體
- 14. 核心數據:具有自引用屬性的遷移實體
- 15. 具有相同屬性值的核心數據提取實體
- 16. 核心數據 - 保存和檢索屬性 - 示例代碼
- 17. Swift核心數據 - 如何更新所有子實體的屬性?
- 18. 單核實體核心數據性能
- 19. 所有核心數據屬性轉爲零
- 20. 核心數據deleteObject將所有屬性設置爲零
- 21. 核心數據更新所有「索引」屬性(iOS)
- 22. 核心數據實體屬性和關係,我想我foobared
- 23. 核心數據屬性唯一性
- 24. 核心數據組按月和總和
- 25. 關係中的核心數據總和
- 26. 核心數據中提取的屬性
- 27. 核心數據 - 遍歷NSManagedObject的屬性
- 28. 核心數據的屬性Count獲取
- 29. 核心數據中的更新屬性
- 30. 關係中的核心數據屬性?
爲什麼downvote? – e1985 2013-02-12 08:21:53
對不起,這是我的不好,我想upvote ... Plz提供您的文章上的一個小編輯,所以我可以切換我的投票 – Yaman 2013-02-12 08:33:29
謝謝你!效果很好! – Vins 2013-02-12 09:15:15