如何在Android Studio中从sqlite存储和检索最近30天的数据?

时间:2018-11-10 06:23:05

标签: android sqlite android-studio

我想从sqlite数据库检索上周或30天的数据,并在listview中显示。我尝试不同的查询,但没有得到结果。  所以我如何才能获取最近30天的数据。 创建数据库表查询

public String CREATE_DATA_TABLE="CREATE TABLE "+TABLE_DATA+"("
            + DATE + " TEXT," + TIME+ " TEXT,"+STEPS + " TEXT,"+CALORIES +" TEXT," +
            DISTANCE+ " TEXT"+")";

存储数据

public boolean storeData(String date,String time,long stepsTaken,
                          long caloriesBurned, String distanceCovered){
        SQLiteDatabase db=this.getWritableDatabase();
        ContentValues values=new ContentValues();
        values.put(DATE, date);
        values.put(TIME, time);
        values.put(STEPS, stepsTaken);
        values.put(CALORIES, caloriesBurned);
        values.put(DISTANCE, distanceCovered);
        long result=db.insert(TABLE_DATA,null, values);
        if(result==-1)
            return false;
        else
            return true;
    }

获取数据,我尝试检索数据的查询在注释行中

public ArrayList<User> getData(){

        calendar=Calendar.getInstance();
        dateFormat=new SimpleDateFormat("yyyy-MM-dd");
        date=dateFormat.format(calendar.getTime());

        ArrayList<User> arrayList= new ArrayList<>();
        SQLiteDatabase db=getReadableDatabase();
        //String query="SELECT * FROM "+ TABLE_DATA+" WHERE date BETWEEN datetime('now','-30 days') AND datetime('now', 'localtime')";
        //Cursor cursor=db.rawQuery(query,null);
       Cursor cursor=db.rawQuery("SELECT * FROM "+TABLE_DATA,null);
        while (cursor.moveToNext()){
            String date=cursor.getString(0);
            String time=cursor.getString(1);
            long steps=cursor.getLong(2);
            long calories=cursor.getLong(3);
            String distance=cursor.getString(4);
            User user=new User(date,time,steps,calories,distance);
            arrayList.add(user);
        }


        return arrayList;

    }

我获取日期和时间的方式

calendar=Calendar.getInstance();
                    dateFormat=new SimpleDateFormat("dd-MM-yyyy");
                    timeFormat= new SimpleDateFormat("HH:mm:ss");
                    date=dateFormat.format(calendar.getTime());
                    time=timeFormat.format(calendar.getTime());
is it anyway that we can only store data of last 30 days

1 个答案:

答案 0 :(得分:0)

您的问题是,由于日期列以日期开头,因此这是第一个比较的字符,因此 * 02-01-1900 大于 2018年1月12日。当您使用 datetime 函数将日期返回为YYYY-MM-DD时,这变得更加复杂,因此您将1990年1月1日与2018年11月11日(较少)进行比较。但是1990年1月21日将高于2018年11月11日(即21年高于20年)。

因此,您必须使用相同格式的日期进行比较或排序,以返回符合预期的结果。

您有两个核心解决方案:-

  1. 修改您的代码以支持的格式存储日期,这恰好也适合比较和排序(即YYYY-MM-DD),请参见Time Strings - SQL As Understood By SQLite - Date And Time Functions

    • 在这种情况下,如果按照String query="SELECT * FROM "+ TABLE_DATA+" WHERE date BETWEEN datee('now','localtime','-30 days') AND date('now', 'localtime')";使用date函数而不是datetime函数,则查询将起作用。
  2. 动态重新格式化从日期列中检索到的日期。例如通过使用:-

    SELECT * FROM table_data WHERE substr(date,7,4)||substr(date,3,4)||substr(date,1,2) BETWEEN date('now','localtime','-30 days') AND date('now','localtime') ;

    • 同样请注意,您应该一致地使用 localtime 的用法(如上文所述,禁止从表中检索的日期存储值时应应用本地时间)。

概念证明

以下是一些可以复制并粘贴到SQLite工具中的SQL,以表明上面的第二个选项有效:-

DROP TABLE IF EXISTS table_data;
CREATE TABLE IF NOT EXISTS table_data (id INTEGER PRIMARY KEY, date TEXT);
INSERT INTO table_data (date) VALUES
  (substr(date('now','localtime','-50 days'),9,2)||substr(date('now','localtime','-50 days'),5,4)||substr(date('now','localtime','-50 days'),1,4)),
    (substr(date('now','localtime','-40 days'),9,2)||substr(date('now','localtime','-40 days'),5,4)||substr(date('now','localtime','-40 days'),1,4)),
    (substr(date('now','localtime','-30 days'),9,2)||substr(date('now','localtime','-30 days'),5,4)||substr(date('now','localtime','-30 days'),1,4)),
    (substr(date('now','localtime','-20 days'),9,2)||substr(date('now','localtime','-20 days'),5,4)||substr(date('now','localtime','-20 days'),1,4)),
    (substr(date('now','localtime','-10 days'),9,2)||substr(date('now','localtime','-10 days'),5,4)||substr(date('now','localtime','-10 days'),1,4))
;
-- Result 1 (the data as loaded)
SELECT * FROM table_data; 

-- Result2 Data extracted using BETWEEN
SELECT * FROM table_data 
    WHERE 
    substr(date,7,4)||substr(date,3,4)||substr(date,1,2) 
    BETWEEN date('now','localtime','-30 days') AND date('now','localtime')
;

-- Result 3 data from 30 days ago on
SELECT * FROM table_data WHERE 
    substr(date,7,4)||substr(date,3,4)||substr(date,1,2) >= date('now','localtime','-30 days')
;

结果:-

结果1

enter image description here

  • (第3、4和5行,共30天)

结果2

enter image description here

结果3

enter image description here

尽管为选项2分配了更多的时间和空间,但建议选项1到目前为止是更好的选择,因为它将减少不必要的复杂性并提高效率。