Проблема заключается в том, что вы предоставляете аргумент согласно 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 или как вы получаете данные из списка.)