如何在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
相关产品推荐
相关产品推荐

