SQLite: Argument an Index 1 kann nicht gebunden werden, da der Index außerhalb des Bereichs liegt. Die Anweisung hat 0 Parameter

70

Ich erhalte den folgenden Fehler und habe keine Ahnung, warum er auftritt. Ich habe mich gefragt, ob jemand anderes in der Lage sein könnte, etwas Licht in das Thema zu bringen.

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)

Der Code ist hier:

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();
Jan Gorzny
quelle
3
Nach dem, was ich über die queryMethode gelesen habe , scheint es selectionsich nicht um einen Spaltennamen zu handeln, sondern um eine vollständige WHERE-Klausel, die möglicherweise ?Verweise auf enthält selectionArgs. Das heißt, selectionsollte so sein "PlayerName=?", selectionArgsals wäre es eine Liste mit einem Wert (wie in Ihrem Code).
Anton Kovalenko

Antworten:

113

Das selectionsollte ein Ausdruck sein und selectionArgsso viele Elemente enthalten, wie ?wörtliche Platzhalter enthalten selection.

Dein selectionist kein Ausdruck und hat keinen, ?aber du hast ein Element in selectionArgs.

Sie möchten wahrscheinlich etwas wie:

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

Damit es sich um einen Ausdruck handelt, der mit der Spalte für den Spielernamen übereinstimmt, wird das Literal, in das Sie binden, verwendet selectionArgs[0].

laalto
quelle
50
In meinem Fall hatte ich das Fragezeichen in solchen einfachen Anführungszeichen '?'. Durch Entfernen der einfachen Anführungszeichen wurde der Fehler behoben.
Theblang
4
@mattblang Ich denke, es wäre eine gute Idee, Ihren Kommentar zu einer neuen Antwort hinzuzufügen, damit mehr Leute wie ich dazu beitragen können. Möchten Sie es versuchen?
Teng-pao Yu
1
@theblang das gleiche Problem, das einige Zeit tötet ... Hey, was ist, wenn wir die Anführungszeichen um eine gebundene vorbereitete Variable brauchen? Zum Beispiel, wenn Sie mit einer Zeichenfolge übereinstimmen?
Varun
0

In meinem Fall hatte ich das Fragezeichen in einfachen Anführungszeichen wie diesem '?'. Durch Entfernen der einfachen Anführungszeichen wurde der Fehler behoben.

Aus dem obigen Kommentar von theblang kopiert.

AJP
quelle