Android Room如何让DAO调用带额外参数的实体构造方法?
解决Room查询时调用指定构造方法的问题
这问题核心是Room默认只会匹配和实体持久化列数量一致的构造方法,而你的bool字段加了@Ignore,Room不把它当成数据库列,所以自动选了两参数的构造方法,完全忽略了查询里的第三列。给你两个可行的解决办法:
方法一:用@ConstructorProperties绑定参数名
- 给带
bool的构造方法加上@ConstructorProperties注解,明确参数对应的名称:
import java.beans.ConstructorProperties; @Entity(tableName = "my_table") public class MyEntity { // ... 其他代码不变 @ConstructorProperties({"id", "data", "bool"}) public MyEntity(Integer id, String data, boolean bool) { this.id = id; this.data = data; this.bool = bool; } // ... getters不变 }
- 修改DAO的查询语句,给第三列起一个和构造参数名一致的别名
bool:
@Dao public interface MyDao { @Query("SELECT id, data, 1 AS bool FROM my_table WHERE id = :id") LiveData<MyEntity> getById(int id); }
方法二:开启编译时保留参数名(无需额外注解)
如果你的项目允许修改编译配置,可以开启Java参数名保留,这样Room能直接通过参数名匹配查询列:
- 在app模块的
build.gradle中添加编译配置:
android { compileOptions { javaCompileOptions { parameters = true // 开启参数名保留 annotationProcessorOptions { // 其他Room配置如果有可以保留,比如schemaLocation等 } } } }
- 同样修改DAO的查询语句,给第三列起别名
bool:
@Dao public interface MyDao { @Query("SELECT id, data, 1 AS bool FROM my_table WHERE id = :id") LiveData<MyEntity> getById(int id); }
此时Room会自动匹配参数名和列别名,调用三参数的构造方法,bool字段就会被设为true。
内容的提问来源于stack exchange,提问作者diwasip777
相关产品推荐
相关产品推荐

