如何使用 Android 中的 Room 根据单个 SQLite 查询中的列值获取记录计数?

How to get counts of records based on a column values in a single SQLite query using Room in Android?

提问人:RKB 提问时间:7/23/2020 更新时间:7/23/2020 访问量:330

问:

我有这个表,其中包含我正在使用的 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
SQL SQLite Android-Room

评论


答:

3赞 hemen 7/23/2020 #1

SQL语法,

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

评论

0赞 RKB 7/23/2020
伟大!这有助于构建基本查询。尽管@simon5678的回答添加了解决方案中重要的部分,但这部分对于将结果作为计数列表很重要。
1赞 simon5678 7/23/2020 #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();

评论

0赞 RKB 7/23/2020
您的回答非常接近我的解决方案,但是由于@Embedded注释破坏了我的 Room 数据库表的一些关键约束,我遇到了一些编译时错误。我最终在以下答案中找到了解决方案,这对我来说是完美的。链接,所以总的来说,我的解决方案包括这些答案和一些小动作的混合。
1赞 Robin Chien 7/23/2020 #3

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

演示代码:

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

评论

0赞 noobEinstien 7/23/2020
它有效率吗?
0赞 Robin Chien 7/23/2020
我不能告诉你它是否更有效,但你可以在许多地方或集合中重用数据(例如 groupBy、sortBy、filter......等),并且只需要一次数据库 I/O。
0赞 RKB 7/23/2020 #4

我认为这对其他开发人员很有用,所以我发布了我的最终解决方案,这是我从上述答案的组合中获得的,正如我在评论中提到的@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
)