1

ボタンをクリックすると、一連のチェックボックスを含むダイアログがポップアップするプログラムがあります。チェックボックスをいくつか選択してから、[OK] をクリックします。私がやろうとしているのは、OKを押すと、チェックした値ごとに、その値を含む行をいくつかのデータベーステーブルで検索し、それらの行から情報を取得し、それらを別のテーブルに入れることです。何らかの理由で、このカーソルが範囲外の例外を取得し続けており、正直なところ理由がわかりません。検索中に見つけた多くのことを試しましたが、機能しません。

[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 Helper アクティビティで呼び出すメソッドの 1 つです。呼び出されるテーブル名を除いて、それらはすべて同じです。

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)
4

2 に答える 2

5

おそらくあなたは悪い状態にあります、あなたの状態を変えてください:

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


注:parametrized statementsまた、より安全で、より速く、より明確なものを使用することをお勧めします。


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});
于 2012-06-24T13:30:52.687 に答える
1

データ、特に行にアクセスしようとする前に、カーソルの最初の行を指していることを確認する必要があります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()と、カーソル データの最初の行が欠落していることになります。

于 2012-06-24T13:53:36.177 に答える