从核心数据中获取子总和

时间:2016-01-01 13:32:21

标签: swift core-data nspredicate executefetchrequest

假设我有三个实体。 的人: 名称 地址 (多人工资)和(多人贷款)

薪酬: 收入 税 Rel :(对一人)

票据 量 Rel :(对一个人)

如何执行具有如下结果的提取:

John Doe,SUM>收入,SUM>金额 Eva Doe,SUM>收入,SUM>金额

使用Swift

1 个答案:

答案 0 :(得分:3)

这可能是使用键值编码“集合运算符”(参见here)而不是获取最容易完成的。对于每个person

let name = person.name
let totalIncome = person.valueForKeyPath("salary.@sum.income")
let totalLoans = person.valueForKeyPath("loans.@sum.amount")

如果性能存在问题,您可以通过修改获取请求(对于Person对象)来“预取”相关的SalaryBills对象来改进:

fetchRequest.relationshipKeyPathsForPrefetching = ["salary", "loans"]

或者,可以在一次获取中检索所需的信息,但我不推荐它,因为它需要更改fetchRequest以返回字典数组而不是NSManagedObjects数组。这使得后续处理(例如,填充表格视图)更加困难。

// Define NSExpression and NSExpressionDescription for the total income
let incomeED = NSExpressionDescription()
incomeED.expression = NSExpression(forKeyPath: "salary.@sum.income")
incomeED.name = "totalIncome"
incomeED.expressionResultType = .Integer64AttributeType
// Define NSExpression and NSExpressionDescription for the total amount
let amtED = NSExpressionDescription()
amtED.expression = NSExpression(forKeyPath: "loans.@sum.amount")
amtED.name = "totalLoans"
amtED.expressionResultType = .Integer64AttributeType
// specify attributes and expressions to fetch
fetchRequest.propertiesToFetch = ["name", incomeED, amtED]
// specify dictionary return type (required to process NSExpressions)
fetchRequest.resultType = .DictionaryResultType

获取的结果将是一个字典数组;每个字典都有键“name”,“totalIncome”和“totalLoans”(带有相应的值)。