Android 无法使用文件室持久性获取查询结果
我正在使用Room持久性库开发一个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
@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")