如何在 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 函数?的主要内容,如果未能解决你的问题,请参考以下文章

Swift Core-Data 从属性列表中删除项目

如何使用 core-data 存储一个值? (迅速 2)

IOS/Core-Data:添加多对多关系

如何在 Mac 和 iPhone 之间同步 Core-Data 应用程序?

Core-Data:如何在一个关系中保存一个对象两次

如何将 CoreData 存储到 iCloud 帐户 iOS 编程?