我为我的android应用程序设计了一个room db。我的所有DAO接口方法都可以使用,除非查询中具有最小/最大函数。
这里是实体类的模拟:
@Entity
public class Data {
@PrimaryKey
@NonNull
private String timestamp;
@ColumnInfo(name = "item_key")
private int itemKey;
...Other stuff...
}
这是一个仅包含所需部分的类:
public class HeaderData {
private int item_key;
private String timestamp;
public HeaderData(int item_key, String timestamp) {
this.item_key = item_key;
this.timestamp = timestamp;
}
}
这是DAO界面:
@Dao
public interface LocationDao {
@Insert
void insertSingleRecord(Data data);
@Query("SELECT * FROM Data")
List<LocationData> getEverything();
@Query("SELECT * FROM Data WHERE item_key = :itemKey")
List<Data> getDbData(int itemKey);
// I dont know why this query is not working!
@Query("SELECT item_key, MIN(timestamp) FROM LocationData GROUP BY item_key")
List<HeaderData> getHeaderData();
}
在上一次查询getHeaderData()
中,MIN
函数似乎无法正常工作,我获得了包含正确item_key
的标头数据列表,但所有timestamp
都是{{ 1}}。有人知道这个问题吗?
答案 0 :(得分:3)
问题在于您返回的pojo并非您从数据库中查询的完全一样:
// I dont know why this query is not working!
@Query("SELECT item_key, MIN(timestamp) FROM LocationData GROUP BY item_key")
List<HeaderData> getHeaderData();
HeaderData确实具有item_key,但是MIN(timestamp)与时间戳不同,它是另一列。这就是时间戳记为空的原因。您可以做的就是这样定义您的pojo:
public class HeaderData {
private int item_key;
private String minTimestamp;
public HeaderData(int item_key, String minTimestamp) {
this.item_key = item_key;
this.minTimestamp = minTimestamp;
}
}
并这样重新定义您的查询:
@Query("SELECT item_key, MIN(timestamp) as minTimestamp FROM LocationData GROUP BY item_key")
List<HeaderData> getHeaderData();