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
答案 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年)。
因此,您必须使用相同格式的日期进行比较或排序,以返回符合预期的结果。
您有两个核心解决方案:-
修改您的代码以支持的格式存储日期,这恰好也适合比较和排序(即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函数,则查询将起作用。动态重新格式化从日期列中检索到的日期。例如通过使用:-
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')
;
以下是一些可以复制并粘贴到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')
;
尽管为选项2分配了更多的时间和空间,但建议选项1到目前为止是更好的选择,因为它将减少不必要的复杂性并提高效率。