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

Room查询数据时触发NullPointerException问题求助

问题原因分析

你碰到的空指针问题,核心原因是同时混用了Room的@Relation注解和手动SQL JOIN查询,两者的机制冲突导致映射失败:

  • @Relation的作用是让Room自动执行关联查询,获取主实体对应的子实体,完全不需要手动写JOIN语句。
  • 你手动加的INNER JOIN会让查询结果包含关联表的所有字段,这会打乱Room的@Relation映射逻辑。Room无法正确区分手动JOIN返回的字段和它自动查询的结果,最终导致currentWeather被解析为null,而你的WeatherModel里这个字段是不可空类型,直接触发空指针异常。

至于App Inspection能正常执行查询,是因为它只执行SQL返回原始数据,不会做Room那样的实体映射,所以不会暴露这个逻辑冲突。

解决方案

两种修复方式二选一即可:

方案1:移除手动JOIN,依赖@Relation自动关联

保留@Relation注解,把DAO的查询改成只查主表,让Room自动处理关联:

@Transaction
@Query("SELECT * FROM weather_location")
fun getWeather(): Flow<List<WeatherModel>>

这是符合Room设计规范的用法,@Relation会根据你配置的parentColumn和entityColumn,自动为每个Location查询对应的Current和Forecast数据。

方案2:移除@Relation,手动映射查询结果

如果一定要保留手动JOIN,就删掉WeatherModel里的@Relation注解,直接把查询结果映射到数据类,注意字段匹配和可空性:

data class WeatherModel(
    val id: String,
    val name: String,
    val currentWeather: CurrentWeatherEntity,
    val weatherForecast: WeatherForecastEntity
)

需要确保SQL查询返回的字段能完全匹配CurrentWeatherEntity和WeatherForecastEntity的字段,如果两个表有同名字段,要给字段加别名区分,避免映射混乱。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 01:12:44