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

Posted

技术标签:

【中文标题】带有日期字符串的 Android SQLite rawquery 在 WHERE 子句中不起作用【英文标题】:Android SQLite rawquery with Date String in WHERE clause not working 【发布时间】:2019-04-28 00:48:35 【问题描述】:

如果今天日期在,我想获取所有数据 在我已经以字符串形式存储在表中的两个日期之间(以 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 作为计数,什么是正确的 这样做的方法。这对我很有帮助。

【问题讨论】:

因为在第二种情况下,日期字符串周围缺少单引号。相反,请使用:String todayString = "'" + e.format(today) + "'"; 但是,您应该了解在 Java 中使用语句,这有助于避免这些类型的错误。 您也没有传递开始日期和结束日期的值。您将它们作为字符串传递 @TimBiegeleisen 非常感谢你,感谢你的帮助。我还在学习中,我会注意你的建议。 @VivekMishra 开始日期和结束日期已经保存在我的数据库中。所以我认为这种方法就足够了。它给了我正确的值。这是一种不好的方法吗? 【参考方案1】:

我认为有问题。

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

您将 todayString 值更改为类似字符串

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

这个。

【讨论】:

非常感谢!它正在工作。这是最简单最简单的解决方案。【参考方案2】:

您的问题是您没有将字符串括在单引号中,因此它被解释为数字,因此是计算。

这是生成的 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;   

请注意,在所有情况下,您都应该关闭光标,如最后一个选项所示,然后再返回,否则光标会保持打开状态,并且由于打开的太多,您可能会出现异常。

以上为原理代码,未经检查或运行,可能存在一些错误。

【讨论】:

这是正确答案。非常感谢。您的解释对我很有帮助。

以上是关于带有日期字符串的 Android SQLite rawquery 在 WHERE 子句中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 Android SQLite 中处理日期的最佳方式 [关闭]

Android - SQLite - 在 Date1 和 Date2 之间选择

如何从 Sqlite ( android ) 中的 datetime 字段获取日期

Android日期SQLite SimpleDateFormat日历[重复]

Android 数据存储 - 文件与 SQLite

如何使用内容提供程序在 Sqlite 数据库中查询 Android 中的时间戳列?