Используйте параметр для выбора данных из базы данных SQlite. - PullRequest
1 голос
/ 12 апреля 2020

Я хочу использовать String d в качестве параметра для выбора данных из базы данных sqlite ..

- ID ------ DATE --------- VALUE 
- 1 --------11/04/2020 ----2000 
- 2 --------11/04/2020 ----4000
- 3 --------11/04/2020 ----1000
- 4 --------12/04/2020 ----700
- 5 --------13/04/2020 ----300

Мой getEntry() метод выглядит следующим образом:

public String getEntry(String d) {
    // This value of storedEntry is returned if there is no data
    String storedEntry = "Nothing!";
    //here we use d to fetch data from table
    String queryString = "SELECT * FROM "+TABLE_NAME+" WHERE "+DATE+"="+ d;
    SQLiteDatabase db = this.getReadableDatabase();
    String table;
    Cursor cursor = db.rawQuery(queryString, null);
    if(cursor.moveToFirst()) {
        do {
           storedEntry = cursor.getString(2);
        } while (cursor.moveToNext());
    } else {
        //Do nothing!
    }
    return storedEntry;
}

Мой onClick метод выглядит следующим образом:

showDataBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                DataBaseHelper helper = new DataBaseHelper(HistoryActivity.this);
                String v = helper.getEntry(dateEditText.getText().toString());
                valueTextView.setText(v);
            }
        });

Но он возвращает ошибку:

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.example.darq2.myapplication, PID: 25073
              android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
                  at android.database.AbstractCursor.checkPosition(AbstractCursor.java:460)
                  at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
                  at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50)
                  at com.example.darq2.myapplication.DataBaseHelper.getEntry(DataBaseHelper.java:61)

ПОЧЕМУ ??

Ответы [ 2 ]

1 голос
/ 12 апреля 2020

Простой, но не безопасный способ сделать это - заключить параметр d в одинарные кавычки, а затем объединить:

String queryString = "SELECT * FROM "+TABLE_NAME+" WHERE "+DATE+"='"+ d + "'";

, но, как я уже сказал, это небезопасно. Используйте ? заполнители для параметров:

String queryString = "SELECT * FROM "+TABLE_NAME+" WHERE "+DATE+"=?";

, а также измените:

Cursor cursor = db.rawQuery(queryString, null); 

на:

Cursor cursor = db.rawQuery(queryString, new String[] {d}); 

Кроме того, вы должны изменить формат вашего даты. SQlite распознает только формат YYYY-MM-DD как действительную дату.

1 голос
/ 12 апреля 2020
android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0

Вы получаете CursorIndexOutOfBoundsException.

Исключение, указывающее, что курсор находится за пределами.

Вы должны исправить свой оператор SELECT.

  Cursor c = db.rawQuery("SELECT * FROM " + TABLE_NAME +" WHERE DATE =?", new String[]{d});
    if (c.moveToFirst()){
        do {
          // Your work
         }
    while(c.moveToNext());
    }
    c.close();
    db.close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...