sqlite使用外键获取数据:由于索引超出范围,因此无法在索引1处绑定参数。该语句具有0个参数

时间:2018-11-28 20:46:29

标签: android-sqlite

我试图从Android的sqlite数据库中获取一条记录,但遇到了麻烦。它通常会引发java.lang.IllegalArgumentException并给我相同的消息。

ajaxResponse

2 个答案:

答案 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)。

  • 即没有参数传递到rawQuery中,因此不希望该语句包含参数占位符()。

但是,由于 SONG 表具有 ARTIST_ID 列,因此无需加入 ARTIST 表

  • 仅在需要有关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错误或如何从列表中获取数据。)