Android SQLite:无法在索引 1 处绑定参数,因为该索引超出范围。该语句有 0 个参数

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/20777533/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 03:25:31  来源:igfitidea点击:

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

androidsqlite

提问by Jan Gorzny

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

回答by laalto

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

Theselection应该是一个表达式,并且selectionArgs应该有与 中的?文字占位符一样多的元素selection

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

selection的不是一个表达式,也没有任何表达式,?但是您在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].

使其成为与玩家名称列再次匹配的表达式selectionArgs[0]

回答by AJP

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.

复制自上面 theblang 的评论。