SQLite: Cannot bind argument at index 1 because the index is out of range. The statement has 0 parameters

AndroidSqlite

Android Problem Overview


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();
    

Android Solutions


Solution 1 - Android

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].

Solution 2 - Android

> 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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJan GorznyView Question on Stackoverflow
Solution 1 - AndroidlaaltoView Answer on Stackoverflow
Solution 2 - AndroidAJPView Answer on Stackoverflow