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