如何在 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?
我有一个 table(交易),其中包含包含 Account_name 和交易金额的记录。我想计算以 'Private' 开头且交易金额 > 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 执行此操作。
谢谢
请记住,CoreData 不是关系数据库,因此您应该考虑实体而不是 "tables",对象不是 "records"。另请注意,按照惯例,属性名称不应以大写字母开头。也就是说,可以构造一个 fetch 来实现你想要的。关键步骤是:
- 创建获取请求
- 指定一个
NSPredicate
以根据您选择的条件进行筛选
- 将
resultType
设置为 .DictionaryResultType
("Group By" 需要)
- 设置要包含在提取中的属性(要获取 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
过滤为 "Private" 开头的那些,并假设您将拥有一个(且只有一个)名称为 "toto" 的帐户(因此 filteredResults[0]
);您的生产代码应该检查。
我有一个 table(交易),其中包含包含 Account_name 和交易金额的记录。我想计算以 'Private' 开头且交易金额 > 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 执行此操作。
谢谢
请记住,CoreData 不是关系数据库,因此您应该考虑实体而不是 "tables",对象不是 "records"。另请注意,按照惯例,属性名称不应以大写字母开头。也就是说,可以构造一个 fetch 来实现你想要的。关键步骤是:
- 创建获取请求
- 指定一个
NSPredicate
以根据您选择的条件进行筛选 - 将
resultType
设置为.DictionaryResultType
("Group By" 需要) - 设置要包含在提取中的属性(要获取 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
过滤为 "Private" 开头的那些,并假设您将拥有一个(且只有一个)名称为 "toto" 的帐户(因此 filteredResults[0]
);您的生产代码应该检查。