繁体   English   中英

WHERE子句中的日期字符串的Android SQLite rawquery不起作用

[英]Android SQLite rawquery with Date String in WHERE clause not working

我希望得到所有数据,如果今天的日期是在我已经作为字符串存储在表中的两个日期之间(以yyyy-MM-dd格式)。 我试过几种方法,但没有成功。

如果我按照以下方式尝试这个,它工作正常并接收正确的值。(count = 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();

}

但我想通过以下方式从我的活动传递日期来做到这一点。这样我得到空光标(count = 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作为计数,这是什么是正确的方法。这将对我非常有帮助。

我认为问题在那里。

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

您将todayString值更改为String like

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

这个。

您的问题是您没有将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); to 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;   
}
  • 请注意,在所有情况下,您应该在返回之前关闭Cursor,如最后一个选项所示,否则Cursor将保持打开状态,并且由于打开太多而您可能会出现异常。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM