Android Room-最近30天(1个月)返回-Java

时间:2018-08-29 12:01:25

标签: java android sqlite android-room

我是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);
    }

}

这是将值分配给createdDateDb的方式(在将其插入数据库之前):

fare.setCreatedDateDb(new Date());

这是我的“实体”类:

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

以及createDateDb的setter和getter

// #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')

不幸的是,它也不起作用。

谢谢!

5 个答案:

答案 0 :(得分:1)

我遇到了这个问题,但我试图从 1 年前开始获取寄存器,当我搜索解决方案时,我发现了这篇文章。我是这样解决的

SELECT * FROM my_table WHERE CAST(my_date/1000 AS LONG) >= strftime('%s', 'now', '-12 month')

使用 calendar.getTime() 存储数据(以毫秒为单位)

说明:

作为 strftime 函数返回 SECONDS 的值,我必须将我的毫秒值除以 1000 并将其转换为 long,因为 sql 将除法结果作为整数返回,然后它才能正常工作

答案 1 :(得分:0)

使用DATE SQLITE功能

@Query("SELECT * FROM fare WHERE createdDateDb >= DATE('now', '-30 day')")

答案 2 :(得分:0)

ConnectionClass objConnectionClass=new ConnectionClass();
con=objConnectionClass.getDataBaseConnection();
pstmtGetAdd=con.prepareStatement(SQL_INSERT_ADDRESS_QUERY,Statement.RETURN_GENERATED_KEYS);
pstmtGetAdd.setString(1, objRegisterVO.getAddress());
pstmtGetAdd.setInt(2, Integer.parseInt(objRegisterVO.getCityId()));
int addId=pstmtGetAdd.executeUpdate();              
if(addId>0)
{
    ResultSet rsVal=pstmtGetAdd.getGeneratedKeys();
    rsVal.next();
    addId=rsVal.getInt(1);
}

上面的这个返回空值,请正确使用

datetime('now', 'now', '-30 day')

答案 3 :(得分:0)

我发现了导致查询无法正常工作的原因-存储在createdDateDb中的Date的格式,即如果假设我们现在添加票价,则将以以下方式保存该票价: 2018年8月29日星期三16:48:55 GMT +01:00

当我将日期存储在createdDateDb中的方式更改为(yyyy-MM-dd)的方式时-查询神奇地按预期工作了;)。

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

非常感谢您的帮助-非常感谢!

答案 4 :(得分:0)

对于将来寻找答案的人们,这是我的解决方案: (strftime('%s','now') - createdDateDb) < CAST(strftime('%s','1970-01-30') AS INTEGER)WHERE子句