日期之间的房间查询不会返回结果

时间:2019-06-03 20:17:23

标签: android sqlite sorting android-room

我正在开发一个与Room Persistence Library一起工作的应用程序。 我有一个名为expence的类,基于它的是具有int amount和Date dob等字段的数据库。 我的目标是使用下面的查询返回这些日期之间所有条目的总和。

@Query("SELECT SUM(amount) FROM expence WHERE dob BETWEEN date( :start ) AND   date( :end )     ")
    int  newallexpensesFromTo(String start,String end);//

但是在当前状态下,查询不返回任何内容,并且我想在textview中显示结果= 0;

我使用了http://androidkt.com/datetime-datatype-sqlite-using-room/中的指南-能够将字符串从日期转换为日期并重新显示。

我已经检查了它的原因,可能是由于存储日期的格式不同,并且与存储在数据库中的数据以及传递给查询的数据相同。

这是我尝试获取条目总和的地方

value2 =db.expenceDao().newallexpensesFromTo(firstdayofmonth,lastdayofmonth);

我有一个类似的查询,其中没有日期,它返回所有条目。 当我添加费用时,我使用DatePicker将日期添加到数据库中的dob。

预期结果是当查询收到带有日期的字符串时,将接收在这些日期之间添加的条目的总和。

2 个答案:

答案 0 :(得分:1)

尝试将startDateendDate作为较长的时间戳值并将其插入到expense表中,而不是以其他格式存储。

现在在查询数据时,请使用查询日期的时间戳值。

例如,如果您希望SUM(amount)01-05-2019之间的31-05-2019比您的查询更像:

@Query("SELECT SUM(amount) FROM expense WHERE dob BETWEEN :startDate AND :endDate")
int  newAllExpensesFromTo(Long startDate,Long endDate);

您的startDateendDate的值分别类似于15566688001559260800

答案 1 :(得分:0)

现在您可以使用type converters

Date文档中所述,您的Java转换器应如下所示

public class Converters {
    @TypeConverter
    public static Date fromTimestamp(Long value) {
        return value == null ? null : new Date(value);
    }

    @TypeConverter
    public static Long dateToTimestamp(Date date) {
        return date == null ? null : date.getTime();
    }
}

要应用它们,请在继承自RoomDatabase()的类上方添加以下代码

@TypeConverters({Converters.class})

最后,您将可以使用它

@Query("SELECT SUM(amount) FROM expence WHERE dob BETWEEN :from AND :to")
int newallexpensesFromTo(from: Date, to: Date)