android 从查询中获取所有正确的值,ID除外

ql3eal8s  于 2023-02-27  发布在  Android
关注(0)|答案(2)|浏览(128)

我创建了一个如下的实体(我删除了一些属性,但结构是相同的)。

@Entity(tableName = "circuits")
public class Circuit {

    @PrimaryKey(autoGenerate = true)
    private int id;
    private String name;

    public Circuit(int id, String name) {
        this.id = id;
        this.name = name;
    }

    @Ignore
    public Circuit(String name) {
        this.name = name;
    }

    @Ignore
    public Circuit() {}

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
@Entity(tableName = "circuit_sessions")
public class CircuitSession {

    @PrimaryKey(autoGenerate = true)
    private int id;
    private int circuitId;
    private int driverId;

    public CircuitSession(int id, int circuitId, int driverId) {
        this.id = id;
        this.circuitId = circuitId;
        this.driverId = driverId;
    }

    @Ignore
    public CircuitSession(int circuitId, int driverId) {
        this.circuitId = circuitId;
        this.driverId = driverId;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getCircuitId() {
        return circuitId;
    }

    public void setCircuitId(int circuitId) {
        this.circuitId = circuitId;
    }

    public int getDriverId() {
        return driverId;
    }

    public void setDriverId(int driverId) {
        this.driverId = driverId;
    }
}

然后我在DAO中有一个这样的查询。

@Query("SELECT * FROM circuits INNER JOIN circuit_sessions ON circuits.id = circuit_sessions.circuitId WHERE circuit_sessions.driverId = :driverId ORDER BY name ASC")
    LiveData<List<Circuit>> getCircuitsWithOwnSessions(int driverId);

当我调用这个查询时,它正确地返回了一个Circuit对象,并且它就是我所期望的电路。但是当我使用该Circuit对象的getId()函数时,它返回了1而不是2,这是正确的电路id。所有其他属性都是正确的,并且是期望的值。只有id是错误的。
当我在Android Studio中检查应用检查并运行查询时,它显示相同的电路,并且显示正确的ID,即2。
那么,当我在代码中调用查询时,什么会导致错误的id呢?有没有一种方法可以确保我总是得到保存在数据库中的id?

oaxa6hgo

oaxa6hgo1#

如果您没有使用2.5.0或更高版本的Room库,请尝试更改以使用它们(如果有任何高于2.5.0的版本)。
列名不明确(如果输出中存在相同的列)。最后一个同名列的值将应用于前面的值。2.5.0应修复此问题。
仅当您使用JOINS而不是方便的@Relation时才会出现此问题(使用此选项是一种替代方法,当使用@Relation时,JOIN通过子查询模拟)。
另一个解决方案是使用唯一的列名。

yshpjwxd

yshpjwxd2#

MikeT的回答给我指出了正确的方向,问题是两个表都有一个id列,我通过将查询改为以下形式解决了这个问题:

@Query("SELECT circuits.* FROM circuits INNER JOIN circuit_sessions ON circuits.id = circuit_sessions.circuitId WHERE circuit_sessions.driverId = :driverId ORDER BY name ASC")
    LiveData<List<Circuit>> getCircuitsWithOwnSessions(int driverId);

相关问题