Запрос DAO не работает с функциями MIN MAX

Я разработал базу данных комнаты для своего приложения для Android. Все мои методы интерфейса DAO работают, за исключением случаев, когда в запросе есть функции min / max.

Вот макет класса сущности:

@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 равны null. Кто-нибудь знает проблему?


person WonderfulMe    schedule 31.07.2018    source источник


Ответы (1)


Проблема в том, что ваше возвращаемое 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();
person Levi Moreira    schedule 31.07.2018
comment
Есть идеи, как получить только минимальное или максимальное значение? По какой-то причине я всегда получаю для него 0, так как возвращаемый тип функции должен быть int. - person android developer; 11.08.2019