0

帯域幅に問題がある方にはお詫び申し上げます。

したがって、SQLiteDatabaseHelper上の図に示すように、数値を読み取り、ブール値を返すクラスのメソッドがあります。ただし、コードを実行すると、次の例外がスローされます。

06-28 19:49:45.881: E/AndroidRuntime(355): FATAL EXCEPTION: main
06-28 19:49:45.881: E/AndroidRuntime(355): android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
06-28 19:49:45.881: E/AndroidRuntime(355):  at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
06-28 19:49:45.881: E/AndroidRuntime(355):  at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
06-28 19:49:45.881: E/AndroidRuntime(355):  at android.database.AbstractWindowedCursor.getInt(AbstractWindowedCursor.java:84)
06-28 19:49:45.881: E/AndroidRuntime(355):  at com.mowdownDevelopments.nagTasks.NagTasksDatabaseHelper.isTaskChecked(NagTasksDatabaseHelper.java:239)
06-28 19:49:45.881: E/AndroidRuntime(355):  at com.mowdownDevelopments.nagTasks.NagTaskListFragment.onPrepareActionMode(NagTaskListFragment.java:184)
06-28 19:49:45.881: E/AndroidRuntime(355):  at com.actionbarsherlock.internal.ActionBarSherlockCompat$ActionModeCallbackWrapper.onPrepareActionMode(ActionBarSherlockCompat.java:1181)
06-28 19:49:45.881: E/AndroidRuntime(355):  at com.actionbarsherlock.internal.app.ActionBarImpl$ActionModeImpl.invalidate(ActionBarImpl.java:713)
06-28 19:49:45.881: E/AndroidRuntime(355):  at com.actionbarsherlock.internal.app.ActionBarImpl.startActionMode(ActionBarImpl.java:405)
06-28 19:49:45.881: E/AndroidRuntime(355):  at com.actionbarsherlock.internal.ActionBarSherlockCompat.startActionMode(ActionBarSherlockCompat.java:178)
06-28 19:49:45.881: E/AndroidRuntime(355):  at com.actionbarsherlock.app.SherlockFragmentActivity.startActionMode(SherlockFragmentActivity.java:50)
06-28 19:49:45.881: E/AndroidRuntime(355):  at com.mowdownDevelopments.nagTasks.NagTaskListFragment.onListItemClick(NagTaskListFragment.java:62)
06-28 19:49:45.881: E/AndroidRuntime(355):  at android.support.v4.app.ListFragment$2.onItemClick(ListFragment.java:58)
06-28 19:49:45.881: E/AndroidRuntime(355):  at android.widget.AdapterView.performItemClick(AdapterView.java:284)
06-28 19:49:45.881: E/AndroidRuntime(355):  at android.widget.ListView.performItemClick(ListView.java:3382)
06-28 19:49:45.881: E/AndroidRuntime(355):  at android.widget.AbsListView$PerformClick.run(AbsListView.java:1696)
06-28 19:49:45.881: E/AndroidRuntime(355):  at android.os.Handler.handleCallback(Handler.java:587)
06-28 19:49:45.881: E/AndroidRuntime(355):  at android.os.Handler.dispatchMessage(Handler.java:92)
06-28 19:49:45.881: E/AndroidRuntime(355):  at android.os.Looper.loop(Looper.java:123)
06-28 19:49:45.881: E/AndroidRuntime(355):  at android.app.ActivityThread.main(ActivityThread.java:4627)
06-28 19:49:45.881: E/AndroidRuntime(355):  at java.lang.reflect.Method.invokeNative(Native Method)
06-28 19:49:45.881: E/AndroidRuntime(355):  at java.lang.reflect.Method.invoke(Method.java:521)
06-28 19:49:45.881: E/AndroidRuntime(355):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
06-28 19:49:45.881: E/AndroidRuntime(355):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
06-28 19:49:45.881: E/AndroidRuntime(355):  at dalvik.system.NativeStart.main(Native Method)

ここに問題があることを示しています:

public boolean isTaskChecked(long taskID){
        SQLiteDatabase db = getReadableDatabase();
        String[] columns = {ID, CHECKED};
        Cursor c = db.query(TASKS, columns, "_id="+taskID, null, null, null, null);
        c.moveToFirst();
        int boolAsInt = c.getInt(1); //This line is throwing.
        //db.close();
        c.close();
        if (boolAsInt==1) {
            return true;
        } else if (boolAsInt==0) {
            return false;
        } else {
            panicButton();
        }
        return false;
    }

写真が示すように、ADBを介してクエリを実行すると、問題なく返されます。(そこで一般的なクエリを使用しましたが、select _id, ischecked from tasks where _id=1;同様に機能しました。)コードが列インデックス1を明確に要求しているのに、インデックス0を要求していると言っている理由と、クエリを実行するときのサイズが0である理由がわかりません。シェル内で機能するものが得られます(とにかくサイズがゼロベースではありませんか?)。誰かが私がこれをデバッグするのを手伝ってもらえますか?

[編集:]それで、問題は、この特定の問題について、私が常に別のクラスから-1を渡していたということでした。皆様のご迷惑をおかけしましたことをお詫び申し上げます。

4

2 に答える 2

3

これを行う:

if(c.moveToFirst()){
    int boolAsInt = c.getInt(1);
}

カーソルが空である可能性があるため、カーソルから値を取得する前に、これを確認する必要があります。moveToFirst()は、カーソルが空の場合にfalseを返すため、ifが入力されず、例外が発生しなくなります。

空のカーソルの理由は、SQLクエリが空の結果セットを返したためです。空でないセットを取得する必要があると確信している場合は、クエリを再度確認してください。

于 2012-07-12T22:19:25.337 に答える
0

getInt メソッドのパラメーターは index であるため、クエリの最初の列を取得しようとしている場合は、0 を指定する必要があります。

于 2014-12-08T07:23:37.267 に答える