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>>?