从两个日期android之间的Sqllite DB中检索数据

我检索两个日期之间的数据一些如何得到正确的结果和一些如何输出空列表视图当我选择日期与月份工作正常但当我选择日期超过一个月它输出空列表视图下面是我的代码

这里我在DB类中声明变量

public static final String EX_RowID = "_id"; public static final String EX_Cattype = "Ecattype"; public static final String EX_Date = "Ecdate"; public static final String EX_Price = "Ecprice"; public static final String EX_Type = "itype"; 

创建表语句

  public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub db.execSQL("CREATE TABLE " + Food_TABLE +"(" + EX_RowID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + EX_Cattype + " TEXT NOT NULL, " + EX_Date + " TEXT NOT NULL," + EX_Price + " INTEGER NOT NULL," + EX_Type + " TEXT NOT NULL UNIQUE );" ); } 

输入数据方法

  public long ExEntry(String Ecatgtype, String Edate, String Eprice, String Eitype) { // TODO Auto-generated method stub ContentValues cv = new ContentValues(); cv.put(EX_Cattype, Ecatgtype); cv.put(EX_Date, Edate ); cv.put(EX_Price, Eprice); cv.put(EX_Type, Eitype); return ourdatabase.insertOrThrow(Food_TABLE, null, cv); } 

在这里我访问ExEntry方法

 ExMgDB Expentry = new ExMgDB(ADD_EX.this); Expentry.open(); Expentry.ExEntry(cate, date, price, itype); Expentry.close(); 

在这里我面临着这两个日期变量之间的问题

  public Cursor CstmRpot(String fd, String td) { // TODO Auto-generated method stub String[] columns = new String[] {EX_RowID,EX_Cattype, EX_Date, EX_Price, EX_Type }; Cursor c= ourdatabase.query(Food_TABLE, columns, EX_Date + " BETWEEN '" + fd + "' AND '" + td + "'" , null, null, null, null); if (c != null) { c.moveToFirst(); } return c; } 

我像下面一样访问它

  CustemRpt dbcs = new CustemRpt(); Cursor cursor = CstDB.CstmRpot(frmdate,tondate); 

有两个主要的解决方案。 所有解决方案都有共同之处,即包含日期的列必须以某种方式进行排序。 如果此订单被销毁,则您的数据已损坏且您的查询无法返回预期结果!

1.将您的日期保存为数据库中的INTEGER ,并使用方法将日期映射到数字:

一种可能的方法是使用Date.getTime ()将日期映射到数字,但还有许多其他。 重要的是

  1. 相等的日期得到相同的数字和
  2. 在另一个日期之后的日期获得更大的数字。

这样订购肯定是正确的。 要使用`Java.util.Date.getTime()实现此目的,如果只想存储日期,则只需将时间设置为0:00:00:000。

例如:

 "CREATE TABLE " + Food_TABLE +"(" + EX_RowID + "INTEGER PRIMARY KEY AUTOINCREMENT, " + EX_Cattype + " TEXT NOT NULL, " + EX_Date + " INTEGER NOT NULL," + EX_Price + " INTEGER NOT NULL," + EX_Type + " TEXT NOT NULL UNIQUE );" private static String dateOnly(java.util.Date d) { Calendar cal = Calendar.getInstance(); // locale-specific cal.setTime(d); cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); return Long.toString(cal.getTimeInMillis()); } public Cursor CstmRpot(java.util.Date fd, java.util.Date td) { // TODO Auto-generated method stub String[] columns = new String[]{EX_RowID,EX_Cattype, EX_Date, EX_Price, EX_Type }; Cursor c= ourdatabase.query(Food_TABLE, columns, EX_Date + " > " + dateOnly (fd) + " AND " + EX_Date + " < " + dateOnly(td), null, null, null, null); if (c != null) { c.moveToFirst(); } return c; } 

如果不使用不同的时区,可以优化dateOnly(java.util.Date d) 。 当然你也可以使用JODA时间。

2.将您的日期保存为TEXT

如果选择此方法,那么比较日期列的查询将会慢一点,但数据库中的条目是人类可读的,而方法1的情况则不然.TEXT -columns与默认情况下为BINARY ,这意味着memcmp()用于比较值并确定哪个值更大或值是否相等。 (记住x BETWEEN a AND b表示x <= a AND x >= b 。)您可以使用此函数memcmp()检查memcmp()的工作。

为确保您获得正确的结果,您必须确保以下内容:

  1. 数据库中的所有日期值必须具有相同的文本长度。
  2. 数据库中的所有日期值必须采用相同的格式。 较大的日期部分(年份)必须在较小的日期部分(月份)之前。
  3. 查询中日期值的所有参数也必须遵循这些规则。

可能的日期格式可能如下所示: yyyy-MM-dd (例如2014-02-042000-12-24 )。

建议

  • 使用android.widget.DatePicker而不是Edittext来获取日期作为输入。
  • 永远不要在查询中直接使用从用户输入中获得的任何文本,而是在之前validation它们(请参阅sql-injection )。
  • 阅读一些关于如何比较字符串的文章。

尝试SELECT * FROM "your table" WHERE date BETWEEN "from date" AND "to date";

你需要存储yyyy-mm-dd的日期通知然后使用这个方法只需调用getWeekData(start_date,end_date);

 public Object getWeekData(String start_date, String end_date) { if (!mDataBase.isOpen()) openDataBase(); Object data = new Object (); // Select All Query String query = (String) ("Select * from " + TBL_NAME + " where " + (COL_DATE + " between '" + start_date + "' AND '" + end_date + "'")); Cursor cursor = mDataBase.rawQuery(query, null); // looping through all rows and adding to list if (cursor.moveToFirst()) { do { //get data over here } while (cursor.moveToNext()); } // closing connection cursor.close(); close(); return data; } 

我们有两个解决这个问题的方法

一个是我们需要将日期和时间转换为毫秒,并采用长数据类型

Sqllite数据库和保存值(转换日期和时间)。 写查询就像“SELECT

data,start_date,end_date from tablename WHERE start_date> end_date“。

第二种方式是你需要以字符串格式保存开始和结束日期+时间(yyy-MM-dd HH:mm:ss)

在Sqllite数据库中,你需要像这样查询,

“SELECT datetime_start,datetime_end FROM tablename WHERE((DATETIME(atetime_start)> =

DATETIME(“+”’“+ entry_start_time +”’“+”)“+”AND DATETIME(datetime_end)

( “+” ‘ “+ entry_end_time +”’ “+”)); 。