我正在使用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字段。通过这种方式它工作!
答案 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指定列名映射。