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

