我正在使用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;
}
}
和
@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 . 字段名称:user> id,car> id .
我想使用以下查询获取所有UserWithCar:
@Query("SELECT * FROM users JOIN cars ON users.id = cars.userId")
List<UserWithCar> getUserWithCar();
使用此查询我收到以下错误:
查询返回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 .
我可以帮忙吗?谢谢!
Update 使用@Wizard帮助,我从@Embeded中删除了前缀,并为User 's id and "cId for the Car'的id添加了@ColumnInfo "uId",以便不具有相同的id字段 . 通过这种方式它工作!
2 回答
错误表示查询返回的列与Pojo类不同 . 应该是一样的 . 或者,您可以使用
@ColumnInfo
注释将Pojo变量映射到列名称 .例如,
这样,
id
将映射到user_id
.更改您的查询:
指定POJO类UserWithCar中的列 . 返回的列必须与所有列匹配,并且与POJO具有相同的列名 . 您可以使用AS更改查询中的列名称 .
或者,您可以使用@ColumnInfo指定列名映射 .