我试图从Android的sqlite数据库中获取一条记录,但遇到了麻烦。它通常会引发java.lang.IllegalArgumentException并给我相同的消息。
ajaxResponse
答案 0 :(得分:1)
我认为您想获取歌手的歌曲列表,并提供artistId
。
我相信在歌曲表DBHelper.TABLE_SONG
的每一行中,都有一列代表艺术家的ID。如果没有应该。
将您的sql语句更改为此:
String selectQuery = "SELECT " + DBHelper.SONG_PATH + " FROM " + DBHelper.TABLE_SONG + " WHERE " + DBHelper.ARTIST_ID + " = ?";
正如我所说,必须有一列DBHelper.ARTIST_ID
或类似名称来标识每首歌曲的歌手。
?
是1参数,其值为artistId
。
答案 1 :(得分:1)
问题是您按照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 + "'";
至:-
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的String)。
但是,由于 SONG 表具有 ARTIST_ID 列,因此无需加入 ARTIST 表
因此简化了:-
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;
}