【问题标题】:Query with date comparision on Android with Room在 Android 上使用 Room 进行日期比较查询
【发布时间】:2020-05-06 13:30:01
【问题描述】:

我想通过与当前日期的日期比较来查询我的数据库。

这是我的查询:

@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();
    }

查询不起作用并且没有检索到结果。我觉得这是日期部分的问题。有人知道我的错误是什么吗?

谢谢。

【问题讨论】:

    标签: android sqlite date android-room


    【解决方案1】:

    SQLite 提供了 5 个函数:

    1. date(...) 只返回日期。
    2. time(...) 只返回时间。
    3. datetime(...) 返回日期和时间。
    4. julianday(...) 返回儒略日。
    5. strftime(...) 返回一个使用给定格式格式化的值 细绳。前四个可以被认为是 strftime 的变体 具有预定义的格式。

    更多信息请阅读博客

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

    【讨论】:

      【解决方案2】:

      由于您在TypeConverter 类中使用了Date.getTime() 方法,因此存储在DB 中的值将是Unix Time

      long getTime()

      返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。

      因此,在您的查询中,您必须将 expiration_date 列值与当前 Unix 时间进行比较。基于SQLite official website,可以通过strftime('%s', 'now')表达式获取当前Unix时间。您的查询应如下所示:

      @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);
      

      【讨论】:

        【解决方案3】:

        你和Autologin.expiration_date &gt; 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')")
        

        效果不好,将 15795501754681579551916 比较,/ 1000 不行,如果是,它有时间秒

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-11-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多