You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Room Database中通过@RawQuery获取受影响行数

解决Room中@RawQuery获取受影响行数始终为0的问题

问题原因

分开执行修改语句(插入/更新/删除)和SELECT CHANGES()查询时,Room可能为每个操作分配不同的数据库连接,或在两次操作之间重置了CHANGES()的返回值,导致无法拿到正确的受影响行数。

解决方案1:将修改语句与查询合并为同一个RawQuery

把更新/删除/插入语句和SELECT CHANGES()放在同一个SQL语句中,用分号分隔,确保在同一个数据库连接上下文里执行:

DAO方法定义

@RawQuery
fun executeModifyAndGetAffectedRows(query: SupportSQLiteQuery): Cursor

调用示例

// 替换为你的实际修改语句,这里以UPDATE为例
val combinedQuery = "UPDATE your_table SET target_column = 'new_value' WHERE id = 123; SELECT CHANGES() AS affected_rows;"
val cursor = daoUnit.executeModifyAndGetAffectedRows(SimpleSQLiteQuery(combinedQuery))
var affectedRowCount = 0
cursor.use { innerCursor ->
    val columnIndex = innerCursor.getColumnIndex("affected_rows")
    if (innerCursor.moveToFirst()) {
        affectedRowCount = innerCursor.getInt(columnIndex)
        Log.e("TAG", "受影响行数: $affectedRowCount")
    }
}

解决方案2:让RawQuery修改方法直接返回受影响行数

Room支持自定义Raw修改方法返回Int类型,该值就是操作的受影响行数,无需额外查询CHANGES():

DAO方法定义

@RawQuery
fun executeModify(query: SupportSQLiteQuery): Int

调用示例

// 替换为你的实际修改语句
val modifyQuery = "DELETE FROM your_table WHERE status = 'expired'"
val affectedRowCount = daoUnit.executeModify(SimpleSQLiteQuery(modifyQuery))
Log.e("TAG", "受影响行数: $affectedRowCount")

内容的提问来源于stack exchange,提问作者Christopher Adonis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 23:51:05