提问人:RKB 提问时间:7/23/2020 更新时间:7/23/2020 访问量:330
如何使用 Android 中的 Room 根据单个 SQLite 查询中的列值获取记录计数?
How to get counts of records based on a column values in a single SQLite query using Room in Android?
问:
我有这个表,其中包含我正在使用的 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
答:
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
演示代码:
- 从 SQLite 获取数据
@Query("SELECT * FROM Students")
abstract fun queryGrade(): List<QueryResult>
- 获取数据并按等级分组
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
)
评论