web-dev-qa-db-fra.com

SQLite: impossible de lier l'argument à l'index 1 car l'index est hors limites. L'instruction a 0 paramètres

J'obtiens l'erreur suivante, et je n'ai aucune idée pourquoi cela se produit. Je me demandais si quelqu'un d'autre pourrait faire la lumière sur la question.

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)

Le code est ici:

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();
67
Jan Gorzny

selection doit être une expression et selectionArgs doit avoir autant d'éléments qu'il y a ? espaces réservés littéraux dans selection.

Votre selection n'est pas une expression et n'a pas de ? mais vous avez un élément dans selectionArgs.

Vous voulez probablement quelque chose comme:

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

pour en faire une expression qui correspond à la colonne du nom du joueur contre le littéral que vous liez dans selectionArgs[0].

111
laalto

Dans mon cas, j'avais le point d'interrogation entre guillemets simples comme celui-ci "?". La suppression des guillemets simples a résolu l'erreur.

Copié du commentaire de theblang ci-dessus.

0
AJP