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

eli*_*yro 10 android android-room

我正在使用Room持久性库开发Android应用程序.我有一个User和一个Car实体

@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;
    }
}
Run Code Online (Sandbox Code Playgroud)

@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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

public class UserWithCar {

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

    @Embedded(prefix = "car_")
    public Car car;
}
Run Code Online (Sandbox Code Playgroud)

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

多个字段具有相同的columnName:id.字段名称:user> id,car> id.

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

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

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

该查询返回com.roomdemo.data.models.UserWithCar不使用的一些列[id,name,id,userId,brand].您可以在字段上使用@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中删除了前缀,我为用户的id添加了@ColumnInfo"uId",为了没有相同的id字段,添加了"cId for the car的id.通过这种方式它可以工作!

Par*_* P. 10

查询返回的列: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;
Run Code Online (Sandbox Code Playgroud)

这样,id将映射到user_id.