【问题标题】:Fetching child sum from Core Data从核心数据中获取子总和
【发布时间】:2016-01-01 13:32:20
【问题描述】:

假设我有三个实体。 人员: 姓名 地址 (to-many-salary) 和 (to-many-loans)

薪水: 收入 税 Rel:(一对一)

账单 数量 Rel:(对一个人)

如何执行获取结果如下:

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

使用 Swift

【问题讨论】:

  • 欢迎来到 SO,请在提问时更具体一点:您尝试过什么,您期望什么等。请参阅how to ask
  • 谢谢 :) 我不知道如何更具体。我列出了带有属性和关系的数据库,显示了我所追求的结果,语言和相关词的标记:)

标签: swift core-data nspredicate executefetchrequest


【解决方案1】:

这可能最容易使用键值编码“集合运算符”(请参阅​​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”(具有相应的值)。

【讨论】:

  • 感谢您的回答!我今天已经在使用该解决方案,但我认为在获取时这样做会更好吗?速度?内存使用情况?我是 Swift 和 Xcode 的新手,所以只是问问 :) 我在 UITableview 中使用数据。
  • @VegarFlo 我认为 KVC 方法是最好的,但我已经用替代方法的详细信息更新了我的答案。
  • 非常感谢! :) 我会照你说的做,使用 KVC。只是认为通过更改获取会提供更好的性能。 :)
  • KCV 可能很快。在更改代码之前进行测量。这完全取决于内存中已经存在的内容。 objc.io/books/core-data
猜你喜欢
  • 2015-02-13
  • 1970-01-01
  • 1970-01-01
  • 2016-12-01
  • 1970-01-01
  • 2018-04-27
  • 1970-01-01
相关资源
最近更新 更多