【问题标题】:How to get counts of records based on a column values in a single SQLite query using Room in Android?如何使用 Android 中的 Room 根据单个 SQLite 查询中的列值获取记录计数?
【发布时间】:2020-07-23 05:24:53
【问题描述】:

我有这张表,其中包含我正在使用的 Room 数据库中的学生的记录,我已经尝试了一些 SQl 查询来获取我想要的内容,如下所述,但这不起作用。

表:学生

 

id  name    grade      age
1   John     Good       10
2   Jan    Average      11
3   Bob      Good        9
4   Peter    Low        11
5   Jack   Average      10
现在,我想根据成绩获取记录计数,因此对于上述记录,查询将根据成绩返回计数,如下所示
 
Good - 2
Average - 2
Low - 1

【问题讨论】:

    标签: android sql sqlite android-room


    【解决方案1】:

    sql语法,

    SELECT grade, COUNT(grade)
    FROM your_table_name
    GROUP BY grade;
    

    【讨论】:

    • 太棒了!这有助于构建基本查询。尽管@simon5678 的回答添加了解决方案的一部分,这对于将结果作为计数列表很重要。
    【解决方案2】:
    class QueryResult{
        String grade;
        @Embedded
        int total_count;
    
    }
    
    @Query("SELECT grade, COUNT(grade) as total_count FROM Students GROUP BY grade")
    List<QueryResult> queryGroupedGrade();
    

    【讨论】:

    • 您的回答与我的解决方案非常接近,但由于@Embedded 注释破坏了我的 Room 数据库表的一些关键约束,我遇到了一些编译时错误。我最终在以下答案中完成了解决方案,这对我来说是完美的。link,所以总体而言,我的解决方案包括这些答案和一些小动作的混合。
    【解决方案3】:

    给出另一种解决方案。如果您使用的是 kotlin,则可以使用 groupBy 函数。 https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/group-by.html

    演示代码:

    1. 从 SQLite 获取数据
    @Query("SELECT * FROM Students")
    abstract fun queryGrade(): List<QueryResult>
    
    1. 获取数据并按年级分组
    fun fetchGrade() {
        return dao.queryGrade().run{
            this.groupBy {it.grade}
        }
    }
    

    【讨论】:

    • 效率高吗?
    • 我不能告诉你它是否更有效,但你可以在许多地方或集合中重用数据(例如 groupBy、sortBy、filter...等)并且只需要数据库 I/哦一次。
    【解决方案4】:

    我认为这对其他开发人员很有用,所以我将我在 cmets 中提到的上述答案的组合中获得的最终解决方案发布到 @simon5678

    @Query("SELECT grade, COUNT(grade) as total_count FROM Students GROUP BY grade")
    fun queryGroupedGrade(): List<QueryResult>
    
    data class QueryResult(
    
        var grade: String = "",
    
        @ColumnInfo(name = "total_count")
        var total_count: Int = 0
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      相关资源
      最近更新 更多