【发布时间】:2018-07-10 06:00:19
【问题描述】:
我正在使用 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 中删除了前缀,并为用户的ID 添加了@ColumnInfo“uId”,为汽车的ID 添加了“cId”,以便没有相同的id 字段。通过这种方式它可以工作!
【问题讨论】:
-
你能更新你的最终答案吗@eliamyro
-
给其他人的注意事项。当您在实体上设置@Fts4 注释时,可能会发生此错误
标签: android android-room