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

时间:2014-02-03 14:01:57

标签: java android sqlite

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

这里我在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);

4 个答案:

答案 0 :(得分:3)

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

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

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

  1. 相等的日期得到相同的数字和
  2. 另一个日期之后的日期会变得更大。
  3. 这样订购肯定是正确的。 要使用`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 - 默认情况下,列以BINARY排序,这意味着memcmp()用于比较值并确定哪个值更大或值是否相等。 (请记住x BETWEEN a AND b表示x <= a AND x >= b。) 您可以使用此功能memcmp()检查memcmp()的工作。

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

    1. 数据库中的所有日期值必须具有相同的文本长度。
    2. 数据库中的所有日期值必须采用相同的格式。较大的日期部分(年份)必须在较小的日期部分(月份)之前。
    3. 查询中日期值的所有参数也必须遵循这些规则。
    4. 可能的日期格式可能如下所示:yyyy-MM-dd(例如2014-02-042000-12-24)。

      <强>通知书

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

你需要存储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;
    }

答案 3 :(得分:0)

我们有两个解决方案来解决这个问题

一个是我们需要将日期和时间转换为毫秒,并在

中采用长数据类型

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

dataname,start_date,end_date from tablename WHERE start_date&gt; end_date“。

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

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

“SELECT datetime_start,datetime_end FROM tablename WHERE((DATETIME(atetime_start)&gt; =

DATETIME(“+”'“+ entry_start_time +”'“+”)“+”AND DATETIME(datetime_end)&lt; DATETIME

( “+” ' “+ entry_end_time +”' “+”));