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

Room数据库测试时sleepDao.get()始终返回null的问题排查

问题根因
  • 实体类SleepNight的主键nightId设置了autoGenerate = true,初始化实例时的默认值0L仅为临时值,调用insert方法插入数据库时,Room会自动生成自增主键作为实际存储的id值,你在insert操作前提前取到的nightId是临时值0,和数据库实际存储的主键不一致,所以查询不到对应数据返回null。
  • 额外注意:当前get方法的返回值声明为非空SleepNight,如果查询不到匹配数据,Room会直接抛出空指针异常而非返回null,建议调整为可空类型更符合使用逻辑。
解决方案

步骤1:修改Dao层insert方法的返回值

Room的@Insert注解支持返回Long类型值,代表插入行对应的实际主键值,修改insert方法定义:

@Insert
fun insert(night: SleepNight): Long

步骤2:修改testGet测试用例逻辑

插入操作完成后再获取实际生成的主键,再进行查询校验:

@Test
@Throws(Exception::class)
fun testGet() {
    val night : SleepNight = SleepNight()
    // 插入后获取数据库生成的真实主键
    val nightID : Long = sleepDao.insert(night)
    val finalNight = sleepDao.get(nightID)
    assertEquals(finalNight?.nightId, nightID)
}

可选优化:调整get方法为可空返回值

避免查询无结果时抛出异常:

@Query("SELECT * FROM daily_sleep_quality_table WHERE nightId=:key")
fun get(key: Long): SleepNight?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 00:18:04