【问题标题】:Not able to get query results using Room persistence无法使用 Room 持久性获取查询结果
【发布时间】: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


【解决方案1】:

查询返回的列: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

【讨论】:

  • 感谢您的回答!当我添加列信息以映射 pojo 变量时,我收到此错误:查询返回的列:user_id、user_name、car_id、car_userId、car_brand。 com.roomdemo.data.models.UserWithCar 中的字段:user_user_id、user_user_name、car_car_id、car_car_userId、car_car_brand。
  • 那是因为,您已将 User@Embedded 嵌入。最终将前缀附加到所有变量。
  • 那么,您是否建议删除@Embedded 注释并使用类型转换器?
  • 没有。只是尝试删除@Embeded 的前缀。
【解决方案2】:

更改您的查询:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-24
    • 2013-12-07
    • 2019-04-25
    • 2011-03-15
    • 2019-11-19
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    相关资源
    最近更新 更多