我创建了一个如下的实体(我删除了一些属性,但结构是相同的)。
@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?
2条答案
按热度按时间oaxa6hgo1#
如果您没有使用2.5.0或更高版本的Room库,请尝试更改以使用它们(如果有任何高于2.5.0的版本)。
列名不明确(如果输出中存在相同的列)。最后一个同名列的值将应用于前面的值。2.5.0应修复此问题。
仅当您使用JOINS而不是方便的@Relation时才会出现此问题(使用此选项是一种替代方法,当使用@Relation时,JOIN通过子查询模拟)。
另一个解决方案是使用唯一的列名。
yshpjwxd2#
MikeT的回答给我指出了正确的方向,问题是两个表都有一个id列,我通过将查询改为以下形式解决了这个问题: