在WHERE子句中使用日期字符串的Android SQLite rawquery无法正常运行

时间:2018-11-26 11:21:08

标签: android sqlite android-studio android-sqlite

如果今天是今天,我想获取所有数据 在我已经以字符串形式存储在表中的两个日期之间(格式为yyyy-MM-dd)。 我尝试了几种方法,但没有解决。

如果我按照以下方式尝试此方法,它可以正常工作并收到正确的值。(计数= 4)

public int getMedicineDataFromDate() {

    SQLiteDatabase db = this.getReadableDatabase();
    String dates = "'2018-11-26'";
    String stext = "SELECT * FROM " + MED_TABLE_NAME + " WHERE " + dates + " BETWEEN STARTING_DATE AND ENDING_DATE";

    @SuppressLint("Recycle") Cursor cursor = db.rawQuery(stext, null);

    return  cursor.getCount();

}

但是我想通过传递活动中的日期来做到这一点 就像下面的方式。这样我得到空光标(计数= 0)。

我的活动之内

 Date today = Calendar.getInstance().getTime();
 SimpleDateFormat e = new SimpleDateFormat("yyyy-MM-dd");
 String todayString = e.format(today);

 int result = mydb.getMedicineDataFromDate(todayString);
 String resl = Integer.toString(result);

 Toast.makeText(MainActivity.this,"Data received " + resl,Toast.LENGTH_LONG).show();

在DatabaseHelper类中

 public int getMedicineDataFromDate(String date) {

    SQLiteDatabase db = this.getReadableDatabase();
    String stext = "SELECT * FROM " + MED_TABLE_NAME + " WHERE " + date + " BETWEEN STARTING_DATE AND ENDING_DATE";

    @SuppressLint("Recycle") Cursor cursor = db.rawQuery(stext, null);

    return  cursor.getCount();

}

如果有人可以解释我为什么第二种方式获得0作为计数,什么是正确的 这样做的方式。这对我很有帮助。

2 个答案:

答案 0 :(得分:1)

我认为有问题了。

 SimpleDateFormat e = new SimpleDateFormat("yyyy-MM-dd");
 String todayString = e.format(today);

您将TodayString值更改为

之类的String
  String todayString ="'"+e.format(today)+"'";

这个。

答案 1 :(得分:0)

您的问题是您没有将String括在单引号中,因此将其解释为好像是数字,因此是一种计算。

这就是生成的SQL(假设日期为2018-11-26,数学上为2018减去11减去26 = 1981)将是:-

SELECT * FROM your_table WHERE 1981 BETWEEN STARTING_DATE AND ENDING_DATE

您可以将String todayString = e.format(today);更改为String todayString = "'" + e.format(today) + "'";

或者您可以使用:-

String stext = "SELECT * FROM " + MED_TABLE_NAME + " WHERE ? BETWEEN STARTING_DATE AND ENDING_DATE";
Cursor cursor = db.rawQuery(stext, new String[]{date}); //<<<<<<<<<< will place quotes around the string for you

或者您可以使用:-

public int getMedicineDataFromDate(String date) {

    SQLiteDatabase db = this.getReadableDatabase();
    String whereclause = "? BETWEEN STARTING_DATE AND ENDING_DATE";
    String[] whereargs = new String[]{date};
    Cursor cursor = db.query(MED_TABLE_NAME,null,whereclause,whereargs,null,null,null);
    int rv = cursor.getCount();
    cusror.close();
    return  rv;   
}
  • 请注意,在所有情况下,如返回最后一个选项所示,应先关闭游标,然后再返回游标,否则游标将保持打开状态,并且由于打开过多而可能导致异常。

  • 上面是原理代码,尚未检查或运行,因此可能会有一些错误。