室错误:查询返回的列没有字段fieldname

Ali*_*lin 5 android android-sqlite android-room android-architecture-components

这是一个示例POJO

public class Product{
  private long id;
  private String name;
  private double price;

 ... constructor for all fields
 ... getters and setters
}
Run Code Online (Sandbox Code Playgroud)

现在,在我的productDAO中,如果我有这样的查询

@Query(select id, name from products)
LiveData<List<Product>> getProducts()
Run Code Online (Sandbox Code Playgroud)

我收到如下错误:

查询返回的列在... Product中没有字段[price],即使它们被注释为非null或原始类型。查询返回的列:[id,name]

a)如果我进入我的产品并设置

@Nullable
private double price;
Run Code Online (Sandbox Code Playgroud)

错误仍然存​​在。

b)如果我进入我的产品并设置

@Ignore
private double price;
Run Code Online (Sandbox Code Playgroud)

错误消失了,但是如果我有另一个查询

 @Query(select p.id, p.name, p.price, t.someField from products p inner join table t)
    LiveData<List<Product>> getJoinQueryResponse()
Run Code Online (Sandbox Code Playgroud)

因为@Ignore已设置,价格返回为0.0。

那么如何解决呢?希望我不需要为房间的每个不同响应都做一个POJO ...

Vik*_*nov 5

基本类型默认不为空。将价格加倍,这将解决问题,因为那时它将为空。此外,您可以添加自定义 getter 以避免价格成为空对象。

public double getPrice(){
    if(this.price == null) return 0.0;
    return this.price;
}
Run Code Online (Sandbox Code Playgroud)

@Ingore告诉 Room 完全忽略该字段,根据您的回答,这不是您想要的。