【问题标题】:How do I use an SQL GROUP BY and SUM functions in a IOS CORE-DATA request in SWIFT?如何在 SWIFT 的 IOS CORE-DATA 请求中使用 SQL GROUP BY 和 SUM 函数?
【发布时间】: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 来做到这一点。

谢谢

【问题讨论】:

    标签: sql swift core-data group-by nsfetchrequest


    【解决方案1】:

    请记住,CoreData 不是关系数据库,因此您应该考虑实体而不是“表”,对象而不是“记录”。另请注意,按照惯例,属性名称不应以大写字母开头。也就是说,可以构造一个 fetch 来实现你想要的。关键步骤是:

    1. 创建提取请求
    2. 指定 NSPredicate 以根据您选择的条件进行过滤
    3. resultType 设置为.DictionaryResultType(“分组依据”所必需的)
    4. 设置要包含在 fetch 中的属性(要获取 sum(),这涉及创建一个 NSExpression 和关联的 NSExpressionDescription)。
    5. 将属性设置为分组依据
    6. 创建一个NSSortDescriptor 以按名称降序排列
    7. 执行提取

    见以下代码:

    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 为键的字典。要获取特定帐户的值,必须使用另一个谓词过滤数组。我现在无法更新我的答案,但我会稍后更新。
    猜你喜欢
    • 2012-09-20
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 2012-09-18
    相关资源
    最近更新 更多