无法使用Room持久性获取查询结果

时间:2018-01-31 07:37:03

标签: android android-room

我正在使用Room持久性库开发Android应用。我有一个用户和一个汽车实体

@Entity(tableName = "users")
public class User {

    @PrimaryKey
    @NonNull
    private int id;
    private String name;

    public User(@NonNull int id, String name) {
        this.id = id;
        this.name = name;
    }
}

@Entity(tableName = "cars", foreignKeys = @ForeignKey(parentColumns  = 
"id", childColumns = "userId", entity = User.class))
public class Car {

    @PrimaryKey(autoGenerate = true)
    private int id;
    private int userId;
    private String brand;

    public Car(int userId, String brand) {
        this.userId = userId;
        this.brand = brand;
    }
}

我还创建了一个UserWithCar类,如下所示:

public class UserWithCar {

    @Embedded(prefix = "user_")
    public User user;

    @Embedded(prefix = "car_")
    public Car car;
}

正如你在UserWithCar中看到的那样,如果我没有收到以下错误,我会使用前缀:

  

多个字段具有相同的columnName:id。字段名称:用户> ID,   汽车>标识。

我想使用以下查询获取所有UserWithCar:

@Query("SELECT * FROM users JOIN cars ON users.id = cars.userId")
List<UserWithCar> getUserWithCar();

使用此查询我收到以下错误:

  

查询返回一些列[id,name,id,userId,brand]   不能使用com.roomdemo.data.models.UserWithCar。您可以使用   @ColumnInfo注释在字段上指定映射。   com.roomdemo.data.models.UserWithCar有一些字段[user_id,   user_name,car_id,car_userId,car_brand],未返回   查询。如果不应该从结果中读取它们,那么   可以用@Ignore注释标记它们。您可以取消此警告   通过使用注释方法   @SuppressWarnings(RoomWarnings.CURSOR_MISMATCH)。返回的列   查询:id,name,id,userId,brand。领域   com.foodtec.roomdemo.data.models.UserWithCar:user_id,user_name,   car_id,car_userId,car_brand。

我可以帮忙吗?谢谢!

更新 使用@Wizard帮助,我从@Embeded中删除了前缀,并添加了@ColumnInfo&#34; uId&#34;对于用户的ID和&#34; cId为Car的id,以便不具有相同的id字段。通过这种方式它工作!

2 个答案:

答案 0 :(得分:7)

  

查询返回的列:id,name,id,userId,brand。领域   com.foodtec.roomdemo.data.models.UserWithCar:user_id,user_name,   car_id,car_userId,car_brand。

错误表示查询返回的列与Pojo类不同。应该是一样的。或者,您可以使用@ColumnInfo注释将Pojo变量映射到列名。

例如,

@PrimaryKey
@NonNull
@ColumnInfo(name = "user_id")
private int id;

这样,id将映射到user_id

答案 1 :(得分:0)

更改查询:

@Query("SELECT * FROM users JOIN cars ON users.id = cars.userId")

指定POJO类UserWithCar中的列。返回的列必须与所有列匹配,并且具有与POJO相同的列名。您可以使用AS更改查询中的列名。

@Query("SELECT userId as userId , brand as brand FROM users JOIN cars ON users.id = cars.userId")

或者,您可以使用@ColumnInfo指定列名映射。