我正在开发一个与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。
预期结果是当查询收到带有日期的字符串时,将接收在这些日期之间添加的条目的总和。
答案 0 :(得分:1)
尝试将startDate
和endDate
作为较长的时间戳值并将其插入到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);
您的startDate
和endDate
的值分别类似于1556668800
和1559260800
。
答案 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)