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

