SQLite: Невозможно связать аргумент с индексом 1, поскольку индекс выходит за пределы диапазона Оператор имеет 0 параметров

54

Я получаю следующую ошибку, и я понятия не имею, почему она происходит. Мне было интересно, сможет ли кто-нибудь еще пролить свет на этот вопрос.

12-25 22:52:50.252: E/AndroidRuntime(813): Caused by: java.lang.IllegalArgumentException: Cannot bind argument at index 1 because the index is out of range.  The statement has 0 parameters.
12-25 22:52:50.252: E/AndroidRuntime(813):  at android.database.sqlite.SQLiteProgram.bind(SQLiteProgram.java:212)
12-25 22:52:50.252: E/AndroidRuntime(813):  at android.database.sqlite.SQLiteProgram.bindString(SQLiteProgram.java:166)
12-25 22:52:50.252: E/AndroidRuntime(813):  at android.database.sqlite.SQLiteProgram.bindAllArgsAsStrings(SQLiteProgram.java:200)
12-25 22:52:50.252: E/AndroidRuntime(813):  at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:47)
12-25 22:52:50.252: E/AndroidRuntime(813):  at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314)
12-25 22:52:50.252: E/AndroidRuntime(813):  at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1161)
12-25 22:52:50.252: E/AndroidRuntime(813):  at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1032)
12-25 22:52:50.252: E/AndroidRuntime(813):  at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1200)

Код находится здесь:

public Player getPlayer(String name) {
    SQLiteDatabase db = this.getReadableDatabase();

    String[] projection = {
            PlayerEntry.COLUMN_NAME_PLAYER_NAME,
            PlayerEntry.COLUMN_NAME_PLAYED_GAMES,
            };

    String selection =  PlayerEntry.COLUMN_NAME_PLAYER_NAME ;
    String[] selectionArgs = new String[1];
    selectionArgs[0] = name;

    Cursor cursor = db.query(
            PlayerEntry.TABLE_NAME,  // The table to query
            projection,                               // The columns to return
            selection,                                // The columns for the WHERE clause
            selectionArgs,                            // The values for the WHERE clause
            null,                                     // don't group the rows
            null,                                     // don't filter by row groups
            null                                 // The sort order
            );

    if (cursor != null)
        cursor.moveToFirst();
  • 2
    Из того, что я прочитал о методе query , кажется, что selection - это не имя столбца, а полное предложение WHERE, которое может содержать ? ссылки на selectionArgs . То есть selection должен быть похож на "PlayerName=?" с selectionArgs являющимся списком одного значения (как в вашем коде).
Теги:

1 ответ

87
Лучший ответ

selection должно быть выражением, а selectionArgs должно иметь столько элементов, сколько есть ? литеральных заполнителей в selection.

Ваш selection не является выражением и не имеет ?, но у вас есть один элемент в selectionArgs.

Вероятно, вы хотите что-то вроде:

String selection =  PlayerEntry.COLUMN_NAME_PLAYER_NAME + "=?";

чтобы сделать это выражение, которое соответствует столбцу имени игрока, снова в литере, который вы связываете в selectionArgs[0].

  • 40
    В моем случае у меня был вопросительный знак внутри одинарных кавычек, как это '?' , Удаление одинарных кавычек решило ошибку.
  • 3
    @mattblang Я думаю, что было бы неплохо добавить свой комментарий к новому ответу, чтобы он мог помочь большему количеству людей, которые столкнулись с этим, как я. Хотите попробовать?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню