首页 文章

无法使用Room持久性获取查询结果

提问于
浏览
3

我正在使用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 回答

  • 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 .

  • 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指定列名映射 .

相关问题