Android 无法使用文件室持久性获取查询结果

Android 无法使用文件室持久性获取查询结果,android,android-room,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

我正在使用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;
    }
}

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

public class UserWithCar {

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

    @Embedded(prefix = "car_")
    public Car car;
}
正如您在UserWithCar中所看到的,我使用前缀,因为如果我没有使用前缀,则会出现以下错误:

多个字段具有相同的列名:id。字段名:user>id, 汽车>身份证

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

@Query("SELECT * FROM users JOIN cars ON users.id = cars.userId")
List<UserWithCar> getUserWithCar();
@Query(“从用户中选择*在users.id=cars.userId上加入汽车”)
列出getUserWithCar();
使用此查询,我得到以下错误:

查询返回一些列[id,name,id,userId,brand],它们是 com.roomdemo.data.models.UserWithCar不使用。你可以用 @字段上的ColumnInfo注释以指定映射。 com.roomdemo.data.models.UserWithCar有一些字段[用户id, 用户未返回的用户名称、车辆id、车辆用户id、车辆品牌] 查询。如果不应该从结果中读取它们,则 可以使用@Ignore注释对其进行标记。您可以取消显示此警告 通过使用 @抑制警告(RoomWarnings.CURSOR\u不匹配)。返回的列 查询:id、name、id、userId、brand。田野 com.foodtec.roomdemo.data.models.UserWithCar:user\u id,user\u name, 汽车id,汽车用户id,汽车品牌

我能得到一些帮助吗?谢谢

更新 使用@Wizard help,我从@Embedded中删除了前缀,并为用户id添加了@ColumnInfo“uId”,为汽车id添加了“cId”,以避免具有相同的id字段。通过这种方式,它可以工作

查询返回的列:中的id、name、id、userId、brand.Fields com.foodtec.roomdemo.data.models.UserWithCar:user\u id,user\u name, 汽车id,汽车用户id,汽车品牌

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

比如说,

@PrimaryKey
@NonNull
@ColumnInfo(name = "user_id")
private int id;
这样,
id
将映射到
user\u id

更改查询:

@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指定列名映射。

谢谢您的回答!当我添加列名信息以映射pojo变量时,我得到以下错误:查询返回的列:user\u id、user\u name、car\u id、car\u userId、car\u brand.Fields in com.roomdemo.data.models.UserWithCar:user\u user\u id、user\u user\u name、 car\u car\u id,car\u car\u userId,car\u car\u brand。这是因为,您已将
@embedded
嵌入
用户
。这最终会将前缀附加到所有变量。因此,您是否建议删除@embedded注释并使用类型转换器?不。只需尝试删除
@embedded
的前缀。您能否更新最终答案@eliamyroNote发送给其他人。在实体上设置@Fts4注释时可能会发生此错误
@Query("SELECT userId as userId , brand as brand FROM users JOIN cars ON users.id = cars.userId")