如何在Room数据库中将String字段转int在DAW查询做比较且不新建表?
Room中String字段转整数执行数值比较查询的方案
Room底层基于SQLite实现,你不需要修改表结构,直接在查询语句中使用SQLite原生的CAST函数做类型转换即可完成数值比较。
具体实现
- 在DAO的
@Query注解的SQL语句中,用CAST(你的字符串字段名 AS INTEGER)将目标字段转为整数类型,再执行>、<之类的比较逻辑即可。
示例代码如下,假设你的表名为goods,待比较的字符串字段是goods_price,要筛选价格大于100小于500的所有商品:
@Dao interface GoodsDao { @Query("SELECT * FROM goods WHERE CAST(goods_price AS INTEGER) > 100 AND CAST(goods_price AS INTEGER) < 500") fun getPriceRangeGoods(): List<Goods> }
注意事项
- 要确保该字符串字段存储的所有内容都是合法的数字格式,SQLite会把无法转换为整数的字符串转为0,会导致查询结果不符合预期。
- 如果字段存储的是带小数的数值,可以将转换目标类型改为
REAL,即CAST(字段名 AS REAL)即可做浮点数比较。 - 频繁做这类转换查询会有一定性能损耗,如果业务上这类查询使用频率很高,后续建议在数据存入时就转为数值类型存储,或者给转换后的表达式加索引优化。
内容的提问来源于stack exchange,提问作者Ahmad Momani
相关产品推荐
相关产品推荐

