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

Android 无法在索引1处绑定参数,因为该索引超出范围。该语句有0个参数。”;,android,mysql,Android,Mysql,我正在努力解决这个问题。谁能帮我渡过难关。请让我知道我在查询语句的where子句中出错的地方。我想从所有列中读取值,然后将它们显示出来 这是我的查询代码: public Task getTask1(String id) { db = helper.getReadableDatabase(); String selection = SQLiteHelper.UID; String[] columns = { SQLiteHelper.UID,

我正在努力解决这个问题。谁能帮我渡过难关。请让我知道我在查询语句的where子句中出错的地方。我想从所有列中读取值,然后将它们显示出来

这是我的查询代码:

public Task getTask1(String id) {


        db = helper.getReadableDatabase();

        String selection = SQLiteHelper.UID;

        String[] columns = { SQLiteHelper.UID,
                SQLiteHelper.TASK_NAME, SQLiteHelper.CONTACTS, SQLiteHelper.DESCRIPTION, SQLiteHelper.REMARKS, SQLiteHelper.DATETIME, SQLiteHelper.ESTIMATED_COMPLETION_TIME,
                SQLiteHelper.ACTUAL_COMPLETION_TIME, SQLiteHelper.NOTIFY_TIME};

        String[] selectionArgs = new String[]{String.valueOf(id)};
Cursor cursor = db.query(
        SQLiteHelper.TABLE_NAME,
        columns,                
        selection,              
        selectionArgs,          
        null,                   
        null,                   
        null                    
);

if (cursor != null) {

            cursor.moveToNext();


            task = new Task(
                    cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getString(4), cursor.getString(5),
                    cursor.getString(6), cursor. getString(7), cursor.getString(8));

            Log.d("Pana", "The value of Task is" + task);

        }


        return task;
    }
根据建议更新的方法:

public Task getTask1(String id) {


        db = helper.getReadableDatabase();

        String selection = SQLiteHelper.UID;

        String[] columns = { SQLiteHelper.UID,
                SQLiteHelper.TASK_NAME, SQLiteHelper.CONTACTS, SQLiteHelper.DESCRIPTION, SQLiteHelper.REMARKS, SQLiteHelper.DATETIME, SQLiteHelper.ESTIMATED_COMPLETION_TIME,
                SQLiteHelper.ACTUAL_COMPLETION_TIME, SQLiteHelper.NOTIFY_TIME};


        String[] selectionArgs = new String[]{SQLiteHelper.TABLE_NAME, String.valueOf(id)};

        Cursor cursor = db.rawQuery("select * from " + SQLiteHelper.TABLE_NAME + " where _id = ?", selectionArgs);

//        if (cursor != null && cursor.moveToFirst()) {
//
//            task = new Task(
//                    cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getString(4), cursor.getString(5),
//                    cursor.getString(6), cursor. getString(7), cursor.getString(8));
//
//            Log.d("Pana", "The value of Task is" + task);
//
//            cursor.close();
//Don't forget to close your cursor, otherwise you will have a memory leak!

        if (cursor != null) {

            while (cursor.moveToNext()) {
                task = new Task(
                        cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getString(4), cursor.getString(5),
                        cursor.getString(6), cursor. getString(7), cursor.getString(8));

                Log.d("Pana", "The value of Task is" + task);
            }

            cursor.close();
        }


        return task;


        }
这是我的日志:

 11:23:06.955    1142-1142/com.ms.t.tms D/AndroidRuntime﹕ Shutting down VM
    --------- beginning of crash
02-27 11:23:06.970    1142-1142/com.ms.t.tms E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.ms.t.tms, PID: 1142
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ms.t.tms/com.ms.t.tms.EditScreen}: java.lang.IllegalArgumentException: Cannot bind argument at index 1 because the index is out of range.  The statement has 0 parameters.
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
            at android.app.ActivityThread.access$800(ActivityThread.java:144)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
     Caused by: java.lang.IllegalArgumentException: Cannot bind argument at index 1 because the index is out of range.  The statement has 0 parameters.
            at android.database.sqlite.SQLiteProgram.bind(SQLiteProgram.java:212)
            at android.database.sqlite.SQLiteProgram.bindString(SQLiteProgram.java:166)
            at android.database.sqlite.SQLiteProgram.bindAllArgsAsStrings(SQLiteProgram.java:200)
            at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:47)
            at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1316)
            at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1163)
            at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1034)
            at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1202)
            at com.ms.t.tms.SQLiteDataBaseAdapter.getTask1(SQLiteDataBaseAdapter.java:143)
            at com.ms.t.tms.EditScreen.onCreate(EditScreen.java:70)
            at android.app.Activity.performCreate(Activity.java:5933)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
            at android.app.ActivityThread.access$800(ActivityThread.java:144)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

我在一行中总共有9列,其中_id是我试图基于_id查询的第一列,我最终得到了这个错误。请帮帮我。我能够插入记录,将记录显示为列表,读取插入记录的详细信息,但当我尝试编辑这些记录时,我面临这个问题。当我将null传递给所有参数时,我总是得到表的第一行。请提供建议。如果需要更多信息,请告诉我。提前感谢。

您的
选择
参数应该如下

String selection = SQLiteHelper.UID + " = ?";
它需要一个
来定义一个占位符,SQLite将在该占位符中绑定
SelectionAgs
中的值


您已经混合并匹配了从这两个答案中选取的代码片段。那不行。将整个方法更改为

公共任务getTask1(字符串id){
db=helper.getReadableDatabase();
String[]columns={SQLiteHelper.UID,SQLiteHelper.TASK_NAME,
SQLiteHelper.CONTACTS,SQLiteHelper.DESCRIPTION,
SQLiteHelper.comments、SQLiteHelper.DATETIME、,
SQLiteHelper.ESTIMATED_COMPLETION_时间,
SQLiteHelper.ACTUAL_COMPLETION_TIME,SQLiteHelper.NOTIFY_TIME};
字符串选择=SQLiteHelper.UID+“=?”;//在更新中丢失!!
字符串[]selectionArgs=新字符串[]{id};
Cursor Cursor=db.query(SQLiteHelper.TABLE_名称、列、选择、,
selectionArgs,null,null,null);
if(cursor!=null&&cursor.moveToFirst()){
任务=新任务(cursor.getString(1)、cursor.getString(2),
cursor.getString(3),cursor.getString(4),
cursor.getString(5),cursor.getString(6),
cursor.getString(7),cursor.getString(8));
Log.d(“Pana”,“任务值为”+任务);
cursor.close();
}
返回任务;
}

您的
选择
参数应该如下

String selection = SQLiteHelper.UID + " = ?";
它需要一个
来定义一个占位符,SQLite将在该占位符中绑定
SelectionAgs
中的值


您已经混合并匹配了从这两个答案中选取的代码片段。那不行。将整个方法更改为

公共任务getTask1(字符串id){
db=helper.getReadableDatabase();
String[]columns={SQLiteHelper.UID,SQLiteHelper.TASK_NAME,
SQLiteHelper.CONTACTS,SQLiteHelper.DESCRIPTION,
SQLiteHelper.comments、SQLiteHelper.DATETIME、,
SQLiteHelper.ESTIMATED_COMPLETION_时间,
SQLiteHelper.ACTUAL_COMPLETION_TIME,SQLiteHelper.NOTIFY_TIME};
字符串选择=SQLiteHelper.UID+“=?”;//在更新中丢失!!
字符串[]selectionArgs=新字符串[]{id};
Cursor Cursor=db.query(SQLiteHelper.TABLE_名称、列、选择、,
selectionArgs,null,null,null);
if(cursor!=null&&cursor.moveToFirst()){
任务=新任务(cursor.getString(1)、cursor.getString(2),
cursor.getString(3),cursor.getString(4),
cursor.getString(5),cursor.getString(6),
cursor.getString(7),cursor.getString(8));
Log.d(“Pana”,“任务值为”+任务);
cursor.close();
}
返回任务;
}
这可能会有帮助:

    public Task getTask1(String id) {


        db = helper.getReadableDatabase();

        String selection = SQLiteHelper.UID;

        String[] columns = { SQLiteHelper.UID,
                SQLiteHelper.TASK_NAME, SQLiteHelper.CONTACTS, SQLiteHelper.DESCRIPTION, SQLiteHelper.REMARKS, SQLiteHelper.DATETIME, SQLiteHelper.ESTIMATED_COMPLETION_TIME,
                SQLiteHelper.ACTUAL_COMPLETION_TIME, SQLiteHelper.NOTIFY_TIME};


        String[] selectionArgs = new String[]{id};

        Cursor cursor = db.rawQuery("select * from " + SQLiteHelper.TABLE_NAME + "  where _id = ?", selectionArgs);

        if (cursor != null && cursor.moveToFirst()) {

            task = new Task(
                    cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getString(4), cursor.getString(5),
                    cursor.getString(6), cursor. getString(7), cursor.getString(8));

            Log.d("Pana", "The value of Task is" + task);

        cursor.close(); //Don't forget to close your cursor, otherwise you will have a memory leak!
        }


        return task;
    }
这可能有助于:

    public Task getTask1(String id) {


        db = helper.getReadableDatabase();

        String selection = SQLiteHelper.UID;

        String[] columns = { SQLiteHelper.UID,
                SQLiteHelper.TASK_NAME, SQLiteHelper.CONTACTS, SQLiteHelper.DESCRIPTION, SQLiteHelper.REMARKS, SQLiteHelper.DATETIME, SQLiteHelper.ESTIMATED_COMPLETION_TIME,
                SQLiteHelper.ACTUAL_COMPLETION_TIME, SQLiteHelper.NOTIFY_TIME};


        String[] selectionArgs = new String[]{id};

        Cursor cursor = db.rawQuery("select * from " + SQLiteHelper.TABLE_NAME + "  where _id = ?", selectionArgs);

        if (cursor != null && cursor.moveToFirst()) {

            task = new Task(
                    cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getString(4), cursor.getString(5),
                    cursor.getString(6), cursor. getString(7), cursor.getString(8));

            Log.d("Pana", "The value of Task is" + task);

        cursor.close(); //Don't forget to close your cursor, otherwise you will have a memory leak!
        }


        return task;
    }


不,我有很多行。我可以查看所有行的详细信息,但无法进入编辑页面。选择“编辑”后,我立即收到此错误。请使用rawQuery而不是query查看我下面的答案,看看这是否有帮助。看起来您在该函数中只尝试返回一行,此外,您只查询了一行。所以,这里不需要一段时间的循环。如果where子句将查询限制为一个_id,则光标只返回一行。是的,您完全正确。但是为什么我的代码会出错?不,我有很多行。我可以查看所有行的详细信息,但无法进入编辑页面。选择“编辑”后,我立即收到此错误。请使用rawQuery而不是query查看我下面的答案,看看这是否有帮助。看起来您在该函数中只尝试返回一行,此外,您只查询了一行。所以,这里不需要一段时间的循环。如果where子句将查询限制为一个_id,则光标只返回一行。是的,您完全正确。但是为什么我的代码会出现错误?根据您的建议更改了代码之后,我得到以下异常:原因:android.database.CursorIndexOutOfBoundsException:请求索引0,大小为0。错误意味着由于where子句,查询未返回任何记录,但您仍在尝试从中读取。如我的回答所示,更改您的if条件。请使用返回一些记录的where子句值重试。上面的答案是什么?我使用了它,它给出了超出范围的索引。当我给null时,它读取所有列,但只读取一行,所以问题在于我的where查询是否正确?如果您需要多条记录,请使用
while
循环,如我的答案所示。即使遇到同样的错误,我也使用while循环。无法在索引2处绑定参数,因为该索引超出范围。该语句有1个参数。根据您的建议更改了代码之后,我收到以下异常:原因:android.database.CursorIndexOutOfBoundsException:请求索引0,大小为0。错误意味着由于where子句,查询未返回任何记录,但您仍在尝试从中读取。如my ans中所示,更改您的if条件