sum 和 group by 在 android roomdatabase Kotlin 中不起作用
sum and group by do not work in android roomdatabase Kotlin
我有一个包含 4 个表的房间数据库,我想在一个查询中同时使用 GROUP BY 和 SUM。
所以我到目前为止所做的:
@Query("SELECT *, SUM(increase) FROM transactions GROUP BY user_id")
fun groupBy(): LiveData<List<Transactions>>?
但是SUM
不起作用(它显示第一次增加user_id。
例如:我有 2 个名为 MAX 和 Amir 的用户,用户 ID 为 1 和 2
Amir(userId 1) 提交 100 美元的增加并再次增加 50 美元。
Max(userId2) 提交 80 美元的增加,然后再次增加 10 美元。
请看结果:
D/TAG: groupBy: 1 100
D/TAG: groupBy: 2 80
它应该显示:
D/TAG: groupBy: 1 150
D/TAG: groupBy: 2 90
一点:
我在数据库中有一个名为 trans_id 的字段,它代表 transactionId。
每次我提交增加或减少或与用户和金钱相关的任何其他内容时,我的应用程序会自动生成一个 id,每次自动生成 transactionId 时它都是 transactionId,但它与上一个不同。
我在哪里使用它?
当我想获取所有用户的交易时
我从中读取数据的函数(在用户列表片段中):
private fun groupBy() {
mUserListViewModel.groupBy()?.observe(viewLifecycleOwner, {
mUserListViewModel.group.value = it
it.forEach {
Log.d("TAG", "groupBy: ${it.userId} // ${it.increase}")
}
})
}
我的视图模型:
val group = MutableLiveData<List<Transactions>>()
fun groupBy(): LiveData<List<Transactions>>? {
return mTransactionDAO.groupBy()
}
数据class:
data class Transactions(
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "trans_id")
var transId: Long = 0L,
@ColumnInfo(name = "user_id", index = true) // <<<<< best to have an index on the column, not required
var userId: Long?,
@ColumnInfo(name = "create_date")
var createDate: String?,
@ColumnInfo(name = "bank_id")
var bankId: Long?,
@ColumnInfo(name = "description")
var description: String?,
@ColumnInfo(name = "increase")
var increase: String?,
@ColumnInfo(name = "decrease")
var decrease: String?,
@ColumnInfo(name = "loan_number")
var loanNumber: String?,
@ColumnInfo(name = "total")
var total: String?,
@ColumnInfo(name = "type")
var type: String?,
@ColumnInfo(name = "loan_id")
var loanId: Long?
)
My database
如果您需要更多代码,请在评论部分告诉我
您的代码不会读取 increase
的总和,而是读取 table 的 increase
列,因为您使用 *
选择所有列。
查询的正确写法是:
@Query("SELECT user_id, SUM(increase) AS increase FROM transactions GROUP BY user_id")
fun groupBy(): LiveData<List<userTotals>>?
这样你就得到 2 列:user_id
和增加的总和,别名为 increase
。
您还需要为查询结果创建一个新的class:
data class userTotals(val user_id: Long?, val increase: Long?)
当您使用 group by 子句时,需要列名删除 * 并像这样添加特定的列名。
@Query("SELECT user_id, SUM(increase) FROM transactions GROUP BY user_id")
fun groupBy(): LiveData<List<Transactions>>?
我有一个包含 4 个表的房间数据库,我想在一个查询中同时使用 GROUP BY 和 SUM。 所以我到目前为止所做的:
@Query("SELECT *, SUM(increase) FROM transactions GROUP BY user_id")
fun groupBy(): LiveData<List<Transactions>>?
但是SUM
不起作用(它显示第一次增加user_id。
例如:我有 2 个名为 MAX 和 Amir 的用户,用户 ID 为 1 和 2
Amir(userId 1) 提交 100 美元的增加并再次增加 50 美元。
Max(userId2) 提交 80 美元的增加,然后再次增加 10 美元。
请看结果:
D/TAG: groupBy: 1 100
D/TAG: groupBy: 2 80
它应该显示:
D/TAG: groupBy: 1 150
D/TAG: groupBy: 2 90
一点: 我在数据库中有一个名为 trans_id 的字段,它代表 transactionId。 每次我提交增加或减少或与用户和金钱相关的任何其他内容时,我的应用程序会自动生成一个 id,每次自动生成 transactionId 时它都是 transactionId,但它与上一个不同。 我在哪里使用它? 当我想获取所有用户的交易时
我从中读取数据的函数(在用户列表片段中):
private fun groupBy() {
mUserListViewModel.groupBy()?.observe(viewLifecycleOwner, {
mUserListViewModel.group.value = it
it.forEach {
Log.d("TAG", "groupBy: ${it.userId} // ${it.increase}")
}
})
}
我的视图模型:
val group = MutableLiveData<List<Transactions>>()
fun groupBy(): LiveData<List<Transactions>>? {
return mTransactionDAO.groupBy()
}
数据class:
data class Transactions(
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "trans_id")
var transId: Long = 0L,
@ColumnInfo(name = "user_id", index = true) // <<<<< best to have an index on the column, not required
var userId: Long?,
@ColumnInfo(name = "create_date")
var createDate: String?,
@ColumnInfo(name = "bank_id")
var bankId: Long?,
@ColumnInfo(name = "description")
var description: String?,
@ColumnInfo(name = "increase")
var increase: String?,
@ColumnInfo(name = "decrease")
var decrease: String?,
@ColumnInfo(name = "loan_number")
var loanNumber: String?,
@ColumnInfo(name = "total")
var total: String?,
@ColumnInfo(name = "type")
var type: String?,
@ColumnInfo(name = "loan_id")
var loanId: Long?
)
My database
如果您需要更多代码,请在评论部分告诉我
您的代码不会读取 increase
的总和,而是读取 table 的 increase
列,因为您使用 *
选择所有列。
查询的正确写法是:
@Query("SELECT user_id, SUM(increase) AS increase FROM transactions GROUP BY user_id")
fun groupBy(): LiveData<List<userTotals>>?
这样你就得到 2 列:user_id
和增加的总和,别名为 increase
。
您还需要为查询结果创建一个新的class:
data class userTotals(val user_id: Long?, val increase: Long?)
当您使用 group by 子句时,需要列名删除 * 并像这样添加特定的列名。
@Query("SELECT user_id, SUM(increase) FROM transactions GROUP BY user_id")
fun groupBy(): LiveData<List<Transactions>>?