76

I'm getting the following error, and I have no idea why it is occurring. I was wondering if anyone else might be able to shed some light on the issue.

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)

The code is here:

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();
1
  • 3
    From what I've read on query method, it seems that selection is not a column name, but a full WHERE clause possibly containing ? references to selectionArgs. That is, selection should be like "PlayerName=?", with selectionArgs being a list of one value (as in your code). Commented Dec 25, 2013 at 23:19

2 Answers 2

121

The selection should be an expression and selectionArgs should have as many elements as there are ? literal placeholders in selection.

Your selection is not an expression and does not have any ? but you have one element in selectionArgs.

You probably want something like:

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

to make it an expression that matches the player name column agains the literal you're binding in selectionArgs[0].

3
  • 58
    In my case I had the question mark inside single quotes like this '?'. Removing the single quotes resolved the error.
    – theblang
    Commented Dec 11, 2014 at 22:44
  • 4
    @mattblang I think it would be a good idea to add your comment to a new answer so it could help more people who ran in to this just like me. Feel like giving it a try? Commented Aug 12, 2016 at 5:53
  • 1
    @theblang same problem killing quite some time... Hey, what if we need the quotes around a bound prepared variable? For example, when you are matching against a string?
    – varun
    Commented Jul 5, 2019 at 23:09
3

In my case I had the question mark inside single quotes like this '?'. Removing the single quotes resolved the error.

Copied from theblang's comment above.

Not the answer you're looking for? Browse other questions tagged or ask your own question.