sqlite выборка данных с использованием внешнего ключа: невозможно связать аргумент с индексом 1, поскольку индекс выходит за пределы диапазона.Оператор имеет 0 параметров - PullRequest
0 голосов
/ 28 ноября 2018

Я пытаюсь получить запись из базы данных sqlite в Android, но у меня возникли проблемы.Он часто выдает java.lang.IllegalArgumentException и выдает мне такое же сообщение.

 mListSongs = mSongDao.getSelectedSongs(artist_id);



public List<Song> getSelectedSongs(Long artistId) {
    List<Song> listSongs = new ArrayList<Song>();
    String selectQuery = "SELECT " + DBHelper.SONG_PATH + " FROM " + DBHelper.TABLE_SONG + " s, "
            + DBHelper.TABLE_ARTIST + " a WHERE s."
            + DBHelper.SONG_ID + " = a.'" + DBHelper.ARTIST_ID + "'";               
    String[] selectionArgs = new String[]{String.valueOf(artistId)};
    Cursor cursor;

    cursor = mDatabase.rawQuery(selectQuery, selectionArgs);



    cursor.moveToFirst();

    while (!cursor.isAfterLast()) {
        Song song = cursorToSelectSong(cursor);
        listSongs.add(song);
        cursor.moveToNext();
    }
    cursor.close();
    return listSongs;
}
private Song cursorToSelectSong(Cursor cursor) {Song song = new Song(); song.setmSong_path(cursor.getString(3)); return song;}

Ответы [ 2 ]

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

Проблема заключается в том, что вы предоставляете аргумент согласно String[] selectionArgs = new String[]{String.valueOf(artistId)};, а затем cursor = mDatabase.rawQuery(selectQuery, selectionArgs);, но в этом операторе (операторе SELECT) нет заполнителя (? ).

Таким образом, у вас есть 1 аргумент , но у оператора есть 0 параметров для замены аргумента.

Изменение: -

String selectQuery = "SELECT " + DBHelper.SONG_PATH + " FROM " + DBHelper.TABLE_SONG + " s, "
        + DBHelper.TABLE_ARTIST + " a WHERE s."
        + DBHelper.SONG_ID + " = a.'" + DBHelper.ARTIST_ID + "'";

to: -

String selectQuery = "SELECT " + DBHelper.SONG_PATH + " FROM " + DBHelper.TABLE_SONG + " s, "
        + DBHelper.TABLE_ARTIST + " a WHERE s."
        + DBHelper.SONG_ID + "=?";

Вводит параметр, и он, ? , будет заменен на artist_id , переданный методу.

Альтернативно с помощью: -

String selectQuery = "SELECT " + DBHelper.SONG_PATH + " FROM " + DBHelper.TABLE_SONG + " s, "
    + DBHelper.TABLE_ARTIST + " a WHERE s."
    + DBHelper.SONG_ID + " =" + String.valueOf(artist_id);

вместе с: -

cursor = mDatabase.rawQuery(selectQuery, null);

также будет работать, НО открыт для инъекции SQL (но на самом деле это не так, как долго было передано, которая не может быть строкой, которая может содержать опасный SQL).

  • т.е. никакие аргументы не передаются в rawQuery и, следовательно, не ожидается, что оператор должен содержать параметр-заполнитель (?).

Однако, нет необходимости JOIN ARTIST в виде таблицы SONG содержит столбец ARTIST_ID .

  • Присоединение требуется только в том случае, если вам нужны другие сведения оARTIST, например, имя исполнителя (которое вы, вероятно, уже знаете, установив ARTIST_ID при вызове метода) .

Как таковое, оно упрощенно: -

String selectQuery = "SELECT " + DBHelper.SONG_PATH + " FROM " + DBHelper.TABLE_SONG + " WHERE " + DBHelper.SONG_ID + "=?";

было бы достаточно.

Что касается проблем с курсором, я бы предложил попробовать: -

cursor = mDatabase.rawQuery(selectQuery, selectionArgs);
DatabaseUtils.dumpCursor(cursor); //<<<<<<<<<< will output the contents of the cursor to the log
while(cursor.moveToNext()) {
    String songpath = cursor.getString(cursor.getColumnIndex(DBHelper.SONG_PATH));
    Log.d("EXTRACTEDPATH", "Extracted PATH " + songpath); //<<<<<<<<<< output extracted path to the log
    Song newsong = new Song();
    newsong.setmSong_path(songpath);
    listSongs.add(newsong);
}
cursor.close();
return listSongs;

}

  • Сбрасывает курсор сразу после его извлечения
  • Использует более простой цикл
  • Использует имя столбца для получения смещения столбца
  • выводит данные из столбца (если он показывает путь в журнале, но вы все равно получаете пустой путь в списке, то это либонеправильный setmSong_path или как вы получаете данные из списка.)
0 голосов
/ 29 ноября 2018

Я думаю, что вы хотите получить список песен исполнителя, предоставив artistId.Я считаю, что в каждой строке таблицы песен DBHelper.TABLE_SONG есть столбец для идентификатора исполнителя.Если нет , то должно быть .Измените свое заявление sql на это:

String selectQuery = "SELECT " + DBHelper.SONG_PATH + " FROM " + DBHelper.TABLE_SONG + " WHERE " + DBHelper.ARTIST_ID + " = ?";

Как я уже сказал, должен быть столбец DBHelper.ARTIST_ID или подобный, чтобы определить исполнителя каждой песни.? является параметром 1, и его значение будет artistId.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...