Запрос с датой сравнения Android с комнатой - PullRequest
1 голос
/ 20 января 2020

Я хочу запросить в моей базе данных сравнение даты с текущей датой.

Вот мой запрос:

@Query("SELECT * FROM User INNER JOIN AutoLogin ON User.user_Id = AutoLogin.user_Id AND AutoLogin.token_Id = :autoLoginToken AND Autologin.expiration_date > date('now')")
Single<User> getUserByAutoLogin(String autoLoginToken);

Вот мой класс AutoLogin:

public class AutoLogin implements Parcelable {
    @NonNull
    @PrimaryKey
    @ColumnInfo(name = "token_Id")
    private String tokenId;
    @NonNull
    @TypeConverters(DataTypeConverter.class)
    @ColumnInfo(name = "expiration_date")
    private Date expirationDate;
    @NonNull
    @ColumnInfo(name = "user_Id")
    private Long userId;

Мои конвертеры:

    @androidx.room.TypeConverter
    public static Date toDate(Long value) {
        return value == null ? null : new Date(value);
    }

    @androidx.room.TypeConverter
    public static Long toLong(Date value) {
        return value == null ? null : value.getTime();
    }

Запрос не работает и не дает результата. Я чувствую, что это проблема с датой. Кто-нибудь видит, в чем моя ошибка?

Спасибо.

Ответы [ 3 ]

1 голос
/ 20 января 2020

Вы не сравнитесь с Autologin.expiration_date > date('now')"

expiration_date как 1579550175468 date('now') как 2020-01-20

Чтобы сравнить то же самое и хотите сделать по дате и времени, вы не можете использовать

@Query("SELECT * FROM User INNER JOIN AutoLogin ON " +
        "User.user_Id = AutoLogin.user_Id " +
        "AND AutoLogin.token_Id = :autoLoginToken " +
        "AND date(Autologin.expiration_date / 1000,'unixepoch') > date('now')")

Другой ответ сказать

@Query("SELECT * FROM User INNER JOIN AutoLogin ON User.user_Id = AutoLogin.user_Id AND AutoLogin.token_Id = :autoLoginToken AND Autologin.expiration_date > strftime('%s', 'now')")

не работает хорошо, сравнить 1579550175468 с 1579551916 это не делает / 1000, если оно делает, у него есть время до секунды

0 голосов
/ 20 января 2020

Так как вы использовали Date.getTime () метод в вашем TypeConverter классе, значение, сохраненное в БД, будет Unix Время .

long getTime ()
Возвращает количество миллисекунд с 1 января 1970 г., 00:00:00 по Гринвичу, представленное этим объектом Date.

Таким образом, в вашем запросе необходимо сравнить значение столбца expiration_date с текущим Unix раз. На основе официального сайта SQLite вы можете получить текущее Unix время по выражению strftime('%s', 'now'). Ваш запрос должен быть как ниже:

@Query("SELECT * FROM User INNER JOIN AutoLogin ON User.user_Id = AutoLogin.user_Id AND AutoLogin.token_Id = :autoLoginToken AND Autologin.expiration_date > (strftime('%s', 'now') * 1000)")
Single<User> getUserByAutoLogin(String autoLoginToken);
0 голосов
/ 20 января 2020

Существует 5 функций, которые предоставляет SQLite:

  1. date (...) возвращает только дату.
  2. time (.. .) возвращает только время.
  3. datetime (...) возвращает дату и время.
  4. julianday (...) возвращает юлианский день.
  5. strftime (...) возвращает значение, отформатированное с использованием заданной строки формата. Первые четыре можно рассматривать как варианты strftime с предопределенным форматом.

Для получения дополнительной информации читайте блог

https://medium.com/androiddevelopers/room-time-2b4cf9672b98

...