Android Room - Возвращение за последние 30 дней (1 месяц) - Java - PullRequest
0 голосов
/ 29 августа 2018

Я новичок в разработке под Android и застрял с довольно простой проблемой (наверное;)).

Я пытаюсь получить записи из SQLite (используя Room) за последние 30 дней.

Это мой запрос, который не работает - он не возвращает никаких записей (из класса @Dao):

 // getting fares for one day (custom-made query)
@Query("SELECT * FROM fare WHERE createdDateDb >=datetime('now', 'now', '-30 day')")
public List<Fare> getFaresOneDay();

Однако этот простой запрос, который извлекает все записи без указанных дат, работает:

 // getting all fare (via custom-made query)
@Query("SELECT * FROM fare ORDER BY createdDateDb DESC")
public List<Fare> getAllFares();

Это мой класс DateTypeConverter:

public class DateTypeConverter {

    @TypeConverter
    public long convertDateToLong(Date date) {
        return date.getTime();
    }

    @TypeConverter
    public Date convertLongToDate(long time) {
        return new Date(time);
    }

}

Это то, как значение присваивается createDateDb (до его вставки в БД):

fare.setCreatedDateDb(new Date());

Это мой класс "Entity":

@Entity(tableName = "fare")
public class Fare {
    private String fareValue;
    private String typeOfJob;

    @PrimaryKey(autoGenerate = true) @NonNull
    private Integer jobId;

    // dates used for user display
    private String createdDate;
    private String createdTime;

    // date var used for comparisons - not to be displayed for the user
    private Date createdDateDb;
}

, а также установщик и получатель для созданного DateDb

// #6 createdDateDb getter
public Date getCreatedDateDb() {
    return createdDateDb;
}

// #6 createdDateDb setter
public void setCreatedDateDb(Date createdDateDb) {this.createdDateDb = createdDateDb; }

Я был бы очень признателен за подсказки, как к нему приблизиться, потому что мне кажется, что я ничего не получаю. Я также попробовал следующее:

SELECT * 
FROM fare 
WHERE createdDateDb BETWEEN datetime('now', 'start of month') AND datetime('now', 'localtime')

К сожалению, это тоже не сработало.

Спасибо!

Ответы [ 3 ]

0 голосов
/ 29 августа 2018
datetime('now', 'now', '-30 day')

Этот код возвращает ноль, используйте его правильно

@Query("SELECT * FROM fare WHERE createdDateDb >=datetime('now', '-30 day')")
0 голосов
/ 29 августа 2018

Я обнаружил, что причина того, что запрос не работает должным образом - формат даты, хранящейся в createDateDb, а именно, если предположить, что мы добавляем тариф сейчас, он будет сохранен следующим образом: Ср 29 Авг 16:48:55 GMT +01: 00 2018

Когда я изменил шаблон того, как Дата хранится в createDateDb, на (гггг-ММ-дд) - запрос магическим образом работает, как и ожидалось;).

            Date c = Calendar.getInstance().getTime();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            String formattedDate = sdf.format(c);

Большое спасибо, ребята, за вашу помощь - я действительно ценю это!

0 голосов
/ 29 августа 2018

Использовать DATE ФУНКЦИЯ SQLITE

@Query("SELECT * FROM fare WHERE createdDateDb >= DATE('now', '-30 day')")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...