如何在 SWIFT 的 IOS CORE-DATA 请求中使用 SQL GROUP BY 和 SUM 函数?
Posted
技术标签:
【中文标题】如何在 SWIFT 的 IOS CORE-DATA 请求中使用 SQL GROUP BY 和 SUM 函数?【英文标题】:How do I use an SQL GROUP BY and SUM functions in a IOS CORE-DATA request in SWIFT? 【发布时间】:2015-01-18 13:20:31 【问题描述】:我有一个表(交易),其中包含包含帐户名称和交易金额的记录。我想计算以“私人”开头且交易金额 > 1000 的每个帐户的所有交易的总数。我想按名称按降序排列帐户。
所以 SQL 请求应该是这样的:
SELECT Account_name, SUM(Amount)
FROM Transactions
WHERE Account_name like 'Private%'
and Amount > 1000
GROUP BY Account_name
ORDER BY Account_name DESC
我将如何在 Swift 中使用 Core-DATA 来做到这一点。
谢谢
【问题讨论】:
【参考方案1】:请记住,CoreData 不是关系数据库,因此您应该考虑实体而不是“表”,对象而不是“记录”。另请注意,按照惯例,属性名称不应以大写字母开头。也就是说,可以构造一个 fetch 来实现你想要的。关键步骤是:
-
创建提取请求
指定
NSPredicate
以根据您选择的条件进行过滤
将resultType
设置为.DictionaryResultType
(“分组依据”所必需的)
设置要包含在 fetch 中的属性(要获取 sum(),这涉及创建一个 NSExpression
和关联的 NSExpressionDescription
)。
将属性设置为分组依据
创建一个NSSortDescriptor
以按名称降序排列
执行提取
见以下代码:
let fetch = NSFetchRequest(entityName: "Transaction")
let predicate = NSPredicate(format: "Account_name like %@ AND Amount > %@", "Private*",NSNumber(double: 1000.0))
fetch.predicate = predicate
fetch.resultType = .DictionaryResultType
let sumExpression = NSExpression(format: "sum:(Amount)")
let sumED = NSExpressionDescription()
sumED.expression = sumExpression
sumED.name = "sumOfAmount"
sumED.expressionResultType = .DoubleAttributeType
fetch.propertiesToFetch = ["Account_name", sumED]
fetch.propertiesToGroupBy = ["Account_name"]
let sort = NSSortDescriptor(key: "Account_name", ascending: false)
fetch.sortDescriptors = [sort]
let results = managedObjectContext?.executeFetchRequest(fetch, error: nil) as NSArray?
结果将是一个字典数组,键为“Account_name”和“sumOfAmount”。
编辑 要提取特定 Account_name 的值,请使用另一个谓词:
let newPredicate = NSPredicate(format: "Account_name like %@", "toto")!
if let resultsArray = results // to unwrap the optional
let filteredResults = resultsArray.filteredArrayUsingPredicate(newPredicate)
let sumOfAmount = (filteredResults[0] as NSDictionary)["sumOfAmount"] as Double
我忽略了上一个示例将Account_name
过滤到以“私人”开头的人的事实,并假设您将拥有一个(并且只有一个)名为“toto”的帐户(因此filteredResults[0]
);你的生产代码应该检查。
【讨论】:
谢谢它很好用。现在有没有办法获得一个帐户的 sumOfAmount。假设我想要名为“toto”的帐户的 sumOfAmount : let sumOfAccountToto = results("toto") 或 let sumOfAccountToto = results["toto"] ? 遗憾的是结果是一个字典数组,而不是一个以 Account_name 为键的字典。要获取特定帐户的值,必须使用另一个谓词过滤数组。我现在无法更新我的答案,但我会稍后更新。以上是关于如何在 SWIFT 的 IOS CORE-DATA 请求中使用 SQL GROUP BY 和 SUM 函数?的主要内容,如果未能解决你的问题,请参考以下文章