【问题标题】:sqlite fetching data using foreign key: Cannot bind argument at index 1 because the index is out of range. The statement has 0 parameterssqlite 使用外键获取数据:无法在索引 1 处绑定参数,因为索引超出范围。该语句有 0 个参数
【发布时间】:2018-11-28 20:46:28
【问题描述】:

我正在尝试从 Android 中的 sqlite 数据库中获取记录,但遇到了问题。它经常抛出 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;}

【问题讨论】:

    标签: java android sqlite android-sqlite


    【解决方案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 注入开放(但不是真的,因为它是一个已通过的 long,它不能是可能包含危险 SQL 的字符串)。

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

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

    • 如果您想要有关 ARTIST 的其他详细信息,例如,您只需要 JOIN艺术家姓名(您可能已经知道,因为您在调用该方法时已确定 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 错误,要么是您从列表中获取数据的方式。)

    【讨论】:

    • 这不仅仅是对我的问题的回答,它对我来说是拯救生命的答案。现在我被困在这里,它正在返回空字符串。歌曲歌曲 = 新歌曲(); song.setmSong_name(cursor.getString(0));返回歌曲;
    • 这里是这个问题的链接 [stackoverflow.com/questions/53541336/…
    • 也许路径实际上是空的。尝试使用String selectQuery = "SELECT * FROM " + DBHelper.TABLE_SONG + " WHERE " + DBHelper.SONG_ID + "=?";,然后检查是否存在其他值。如果没有,请提出一个新问题(这里是凌晨 1:30,4 小时后必须起床,所以需要睡觉)
    • nope 路径不为空。我有另一个活动显示歌曲表中的所有值。并且路径显示在该活动上。
    • @AliRaza 而不是cursor.getString(0)(只有1列,所以必须是0而不是3)使用cursor.getString(cursor.getColumnIndex(DBHelper.SONG_PATH));。此外,您可能希望尝试在 cursor = mDatabase.rawQuery(selectQuery, selectionArgs); 行之后立即添加 DatabaseUtils.dumpCursor(cursor);,它会将光标的内容输出到日志中。
    【解决方案2】:

    我想你想获取一个艺术家的歌曲列表,提供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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-19
      • 2014-03-29
      相关资源
      最近更新 更多