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

Room中带String主键的DTO如何按隐藏rowid排序?

在Room中按String主键实体的插入顺序排序问题解决

问题原因

这既不是操作错误,也不是Room KSP编译器的BUG,而是Room静态查询验证机制结合SQLite隐藏列特性导致的:

  • SQLite规则:只有当表的主键为INTEGER PRIMARY KEY时,主键才会成为隐藏rowid列的别名;若主键是字符串类型,表依然会自动生成rowid列,但它属于SQLite内部隐藏列,并未在你的Item实体类中声明。
  • Room的KSP编译器在做查询静态检查时,会验证SQL中引用的列是否存在于对应实体类中,直接写rowid会被判定为不存在的列,从而抛出错误。

解决方案

不需要新增冗余索引列,只需用SQLite标准的隐藏列引用语法_rowid_替代rowid即可,Room的编译器能识别这个保留字:

@Query("SELECT * FROM Item ORDER BY _rowid_ DESC")
fun getItemsSortedByInsertionOrder(): List<Item>

如果需要在查询结果中获取rowid的具体值,可以定义一个包含该字段的DTO,同时在查询中显式映射:

// 新增包含rowid的DTO
data class ItemWithRowId(
    val guid: String,
    val title: String,
    val rowId: Long
)

// DAO中的查询方法
@Query("SELECT *, _rowid_ AS rowId FROM Item ORDER BY rowId DESC")
fun getItemsWithRowIdSortedByInsertion(): List<ItemWithRowId>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 00:59:51