Android SQLite rawquery с Date String в предложении WHERE не работает - PullRequest
0 голосов
/ 26 ноября 2018

Я хочу получить все данные, если сегодняшняя дата находится между двумя датами, которые я уже сохранил в таблице в виде строк (в формате гггг-ММ-дд).Я пробовал несколько способов, но ничего не получилось.

Если я попробую это следующим образом, он будет работать нормально и получать правильные значения. (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();

}

Но что я хочусделать это, передав дату из моей деятельности следующим образом. И таким образом я получаю пустой курсор (количество = 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 голосов
/ 26 ноября 2018

Я думаю, что проблема есть.

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

Вы изменили значение todayString как String, например

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

this.

0 голосов
/ 26 ноября 2018

Ваша проблема заключается в том, что вы не заключили строку в одинарные кавычки, и поэтому она интерпретируется так, как если бы она была числовой и, следовательно, расчетной.

Это результирующий 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;   
}
  • Обратите внимание, что во всех случаях вы должны закрывать курсор, как показано в последнем варианте,перед возвратом, в противном случае Курсор остается открытым, и у вас есть вероятность исключения из-за слишком большого числа открытых.

  • Вышеприведенный код является принципиальным и не был проверенили запустить и, следовательно, могут иметь некоторые ошибки.

...