Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:光标超出边界异常_Android_Sqlite - Fatal编程技术网

Android:光标超出边界异常

Android:光标超出边界异常,android,sqlite,Android,Sqlite,我有一个程序,你点击一个按钮,一个对话框弹出一堆复选框。选择几个复选框,然后单击“确定”。我想做的是,当您按下ok键时,对于您选中的每个值,它将在多个数据库表中搜索包含该值的行,从这些行中获取信息,并将它们放在不同的表中。出于某种原因,我一直让这个游标出界异常,我真的不知道为什么。我尝试了一大堆我在搜索时发现的东西,但我无法让它工作 以下是单击“确定”时发生的情况: ok.setOnClickListener(new View.OnClickListener(){ public void

我有一个程序,你点击一个按钮,一个对话框弹出一堆复选框。选择几个复选框,然后单击“确定”。我想做的是,当您按下ok键时,对于您选中的每个值,它将在多个数据库表中搜索包含该值的行,从这些行中获取信息,并将它们放在不同的表中。出于某种原因,我一直让这个游标出界异常,我真的不知道为什么。我尝试了一大堆我在搜索时发现的东西,但我无法让它工作

以下是单击“确定”时发生的情况:

ok.setOnClickListener(new View.OnClickListener(){
    public void onClick(View v) {

        if (dumbbells.isChecked()==true){
            equip = "dumbbells";
            AddToEquipTable(equip);
        }
        if (barbell.isChecked()==true){
            equip = "Barbell";
            AddToEquipTable(equip);
        }
        if (cablemachine.isChecked()==true){
            equip = "Cable Machine";
            AddToEquipTable(equip);
        }
        if (pullupbar.isChecked()==true){
            equip = "Pull Up Bar";
            AddToEquipTable(equip);
        }
        if (legpressmachine.isChecked()==true){
            equip = "Leg Press Machine";
            AddToEquipTable(equip);
        }
        if (legextensionmachine.isChecked()==true){
            equip = "Leg Extension Machine";
            AddToEquipTable(equip);
        }
        if (hamstringcurlmachine.isChecked()==true){
            equip = "Hamstring Curl Machine";
            AddToEquipTable(equip);
        }
        if (kettlebells.isChecked()==true){
            equip = "Kettlebells";
            AddToEquipTable(equip);
        }
        if (none.isChecked()==true){
            equip = "None";
            AddToEquipTable(equip);
        }


    }
});
以下是我创建的“AddToEquipTable”方法:

public void AddToEquipTable(String equip){

ExerciseDatabase equipment = new ExerciseDatabase(WorkMeOutActivity.this);
try {
    equipment.open();
} catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

equipment.AddToEquipmentDBFromBiceps(equip);
equipment.AddToEquipmentDBFromChest(equip);
equipment.AddToEquipmentDBFromBack(equip);
equipment.AddToEquipmentDBFromTriceps(equip);
equipment.AddToEquipmentDBFromShoulders(equip);
equipment.AddToEquipmentDBFromLegs(equip);
equipment.AddToEquipmentDBFromCompound(equip);

equipment.close();
}
下面是它在我的DB助手活动中调用的方法之一。除了名为的表名之外,它们都是相同的

public String AddToEquipmentDBFromBiceps(String equip) {
    // TODO Auto-generated method stub
    String[] columns = new String[]{KEY_REPS, KEY_EXERCISE, KEY_TIMETYPE};
    ContentValues cv = new ContentValues();
    Cursor c = ourDatabase.query(DATABASE_BICEPSTABLE, columns, KEY_EQUIP + "='" + equip + "'", null, null, null, null);

    if (c == null){
        return null;
    }
    else if(c != null){

        c.moveToFirst();

        int iReps = c.getColumnIndex(KEY_REPS);
        int iExercise = c.getColumnIndex(KEY_EXERCISE);
        int iTimeType = c.getColumnIndex(KEY_TIMETYPE);



        do{

            String reps = c.getString(iReps);
            String exercise = c.getString(iExercise);
            String time = c.getString(iTimeType);

            cv.put(KEY_REPS, reps);
            cv.put(KEY_EXERCISE, exercise); 
            cv.put(KEY_TIMETYPE, time);

            ourDatabase.insert(DATABASE_CHOSEN_EQUIP_TABLE, null, cv);

            c.moveToNext();

            }while(KEY_EQUIP == equip);
        }


    return null;
}
**按以下建议更改条件后的错误日志:

06-24 09:34:42.785: E/AndroidRuntime(20592): FATAL EXCEPTION: main
06-24 09:34:42.785: E/AndroidRuntime(20592): android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
06-24 09:34:42.785: E/AndroidRuntime(20592):    at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
06-24 09:34:42.785: E/AndroidRuntime(20592):    at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
06-24 09:34:42.785: E/AndroidRuntime(20592):    at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41)
06-24 09:34:42.785: E/AndroidRuntime(20592):    at com.work.me.out.ExerciseDatabase.AddToEquipmentDBFromLegs(ExerciseDatabase.java:896)
06-24 09:34:42.785: E/AndroidRuntime(20592):    at com.work.me.out.WorkMeOutActivity.AddToEquipTable(WorkMeOutActivity.java:456)
06-24 09:34:42.785: E/AndroidRuntime(20592):    at com.work.me.out.WorkMeOutActivity$9.onClick(WorkMeOutActivity.java:395)
06-24 09:34:42.785: E/AndroidRuntime(20592):    at android.view.View.performClick(View.java:2538)
06-24 09:34:42.785: E/AndroidRuntime(20592):    at android.view.View$PerformClick.run(View.java:9152)
06-24 09:34:42.785: E/AndroidRuntime(20592):    at android.os.Handler.handleCallback(Handler.java:587)
06-24 09:34:42.785: E/AndroidRuntime(20592):    at android.os.Handler.dispatchMessage(Handler.java:92)
06-24 09:34:42.785: E/AndroidRuntime(20592):    at android.os.Looper.loop(Looper.java:130)
06-24 09:34:42.785: E/AndroidRuntime(20592):    at android.app.ActivityThread.main(ActivityThread.java:3687)
06-24 09:34:42.785: E/AndroidRuntime(20592):    at java.lang.reflect.Method.invokeNative(Native Method)
06-24 09:34:42.785: E/AndroidRuntime(20592):    at java.lang.reflect.Method.invoke(Method.java:507)
06-24 09:34:42.785: E/AndroidRuntime(20592):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
06-24 09:34:42.785: E/AndroidRuntime(20592):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
06-24 09:34:42.785: E/AndroidRuntime(20592):    at dalvik.system.NativeStart.main(Native Method)

可能您的身体状况不好,请更换:

while (c.moveToNext() && KEY_EQUIP == equip);

注意:我还建议您使用更安全、更快、更清晰的
参数化语句


CursorIndexOutOfBoundsException:请求索引0,大小为0

这意味着
cursor.moveToFirst()
返回false,并且
cursor
为空。 因此,请尝试添加此代码段并进行尝试

else if(c != null && c.moveToFirst()) {
        int iReps = c.getColumnIndex(KEY_REPS);
        int iExercise = c.getColumnIndex(KEY_EXERCISE);
        int iTimeType = c.getColumnIndex(KEY_TIMETYPE);
        do {
            String reps = c.getString(iReps);
            String exercise = c.getString(iExercise);
            String time = c.getString(iTimeType);

            cv.put(KEY_REPS, reps);
            cv.put(KEY_EXERCISE, exercise); 
            cv.put(KEY_TIMETYPE, time);

            ourDatabase.insert(DATABASE_CHOSEN_EQUIP_TABLE, null, cv);
            } while (c.moveToNext() && KEY_EQUIP == equip);
        }
尝试使用类似以下的
rawQuery
方法:

final String SELECT_QUERY = "SELECT " + KEY_REPS + ", " + KEY_EXERCISE + ", " + KEY_TIMETYPE + " FROM " + DATABASE_BICEPSTABLE + " WHERE " + KEY_EQUIP + " = ?";
Cursor c = db.rawQuery(SELECT_QUERY, new String[] {equip});

可能您的身体状况不好,请更换:

while (c.moveToNext() && KEY_EQUIP == equip);

注意:我还建议您使用更安全、更快、更清晰的
参数化语句


CursorIndexOutOfBoundsException:请求索引0,大小为0

这意味着
cursor.moveToFirst()
返回false,并且
cursor
为空。 因此,请尝试添加此代码段并进行尝试

else if(c != null && c.moveToFirst()) {
        int iReps = c.getColumnIndex(KEY_REPS);
        int iExercise = c.getColumnIndex(KEY_EXERCISE);
        int iTimeType = c.getColumnIndex(KEY_TIMETYPE);
        do {
            String reps = c.getString(iReps);
            String exercise = c.getString(iExercise);
            String time = c.getString(iTimeType);

            cv.put(KEY_REPS, reps);
            cv.put(KEY_EXERCISE, exercise); 
            cv.put(KEY_TIMETYPE, time);

            ourDatabase.insert(DATABASE_CHOSEN_EQUIP_TABLE, null, cv);
            } while (c.moveToNext() && KEY_EQUIP == equip);
        }
尝试使用类似以下的
rawQuery
方法:

final String SELECT_QUERY = "SELECT " + KEY_REPS + ", " + KEY_EXERCISE + ", " + KEY_TIMETYPE + " FROM " + DATABASE_BICEPSTABLE + " WHERE " + KEY_EQUIP + " = ?";
Cursor c = db.rawQuery(SELECT_QUERY, new String[] {equip});

在尝试访问任何数据之前,必须确保指向光标的第一行,尤其是行
c.getColumnIndex(KEY_XXX)
。您调用了
c.moveToFirst()
,但没有检查其结果(在您的情况下,该结果应返回false,因为没有数据行)

if(c != null && c.moveToFirst()) {
    int iReps = c.getColumnIndex(KEY_REPS);
    int iExercise = c.getColumnIndex(KEY_EXERCISE);
    int iTimeType = c.getColumnIndex(KEY_TIMETYPE);

    do {
        String reps = c.getString(iReps);
        String exercise = c.getString(iExercise);
        String time = c.getString(iTimeType);

        cv.put(KEY_REPS, reps);
        cv.put(KEY_EXERCISE, exercise); 
        cv.put(KEY_TIMETYPE, time);

        ourDatabase.insert(DATABASE_CHOSEN_EQUIP_TABLE, null, cv);    
    } while(c.moveToNext() && KEY_EQUIP == equip);
} else {
    return null;
}

请注意,在此处使用
do..while
循环而不是常规的
while
循环非常重要,因为调用
c.moveToFirst()
后接
c.moveToNext()
紧跟其后意味着您丢失了光标数据的第一行!

在尝试访问任何数据之前,您必须确保您指向光标的第一行,特别是
c.getColumnIndex(KEY_XXX)
。您调用了
c.moveToFirst()
,但没有检查其结果(在您的情况下,应返回false,因为没有数据行

if(c != null && c.moveToFirst()) {
    int iReps = c.getColumnIndex(KEY_REPS);
    int iExercise = c.getColumnIndex(KEY_EXERCISE);
    int iTimeType = c.getColumnIndex(KEY_TIMETYPE);

    do {
        String reps = c.getString(iReps);
        String exercise = c.getString(iExercise);
        String time = c.getString(iTimeType);

        cv.put(KEY_REPS, reps);
        cv.put(KEY_EXERCISE, exercise); 
        cv.put(KEY_TIMETYPE, time);

        ourDatabase.insert(DATABASE_CHOSEN_EQUIP_TABLE, null, cv);    
    } while(c.moveToNext() && KEY_EQUIP == equip);
} else {
    return null;
}

请注意,在此处使用
do..while
循环而不是常规的
while
循环非常重要,因为调用
c.moveToFirst()
后接
c.moveToNext()
紧接着它意味着您丢失了第一行光标数据!

我刚刚尝试过…仍然将相同的光标移出边界例外请查看我更新的答案,并将您的条件片段替换为我的条件片段。这不会产生任何错误,但也不会将任何值放入所选的“设备”表中。因为您的条件不会改变因为你的光标是空的,所以你需要检查你的光标是否正确。当我像最初那样使用它时,如果我选择了第一个复选框,它工作得很好,因为所有的表都包含第一个复选框中的值。但是一旦选择了任何其他复选框,它将崩溃并将光标从列表中取出边界异常。您认为我需要首先检查表中是否存在该值吗?我只是尝试了一下…仍然将相同的光标移出边界异常请查看我更新的答案并将您的条件片段替换为我的。这不会产生任何错误,但也不会将任何值放入所选的表中。因为您的条件在never be process上,由于光标为空,您需要检查光标是否正确。当我按照最初的方式使用光标时,如果选择第一个复选框,则效果良好,因为所有表都包含具有第一个复选框值的内容。但一旦选择任何其他复选框,它将崩溃并将光标交给我越界异常。您认为我需要首先检查表中是否存在该值吗?