Сбой курсора: запрошен индекс 0 с размером 0 - PullRequest
4 голосов
/ 06 февраля 2012

Я не знаю, почему мой курсор пуст. Я прочитал другие 4-5 вопросов, которые содержат то же сообщение, но я не смог решить мою проблему. Что я забыл?

С этим кодом я получил сообщение: "Курсор пуст":

    public void onClick(View arg0) {
        String txt_edit_hw = edit_hw.getText().toString(); 
        ContentValues args = new ContentValues();
        args.put("hw", txt_edit_hw);

        String test = "SELECT _id FROM tbl_homework where hw='"+ txt_edit_hw +"';";

        Cursor mCursor = db.rawQuery(test, null); 

        startManagingCursor(mCursor);
        if (mCursor.moveToFirst()){

        String hw = mCursor.getString(mCursor.getColumnIndex("hw"));


        doMessage(hw);
        db.update("tbl_homework", args, "_id=34", null);
        fillData();
        } else {
            doMessage("Cursor is empty");
        }
    }

С этим кодом я получил запрос ... Индекс 0 Android запрошен, с размером 0:

    public void onClick(View arg0) {
        String txt_edit_hw = edit_hw.getText().toString(); 
        ContentValues args = new ContentValues();
        args.put("hw", txt_edit_hw);

        String test = "SELECT _id FROM tbl_homework where hw='"+ txt_edit_hw +"';";

        Cursor mCursor = db.rawQuery(test, null); 

        startManagingCursor(mCursor);
        mCursor.moveToFirst();

        String hw = mCursor.getString(mCursor.getColumnIndex("hw"));

        doMessage(hw);
        db.update("tbl_homework", args, "_id=34", null);
        fillData();
    }

Та же ошибка в этом случае: она падает в строке (я это прокомментировал)

        public void onClick(View arg0) {
        String txt_edit_hw = edit_hw.getText().toString(); 
        txt_edit_hw.trim();
        ContentValues args = new ContentValues();
        args.put("hw", txt_edit_hw);

        String test = "SELECT _id FROM tbl_homework where hw='"+ txt_edit_hw +"';";

        Cursor mCursor = db.rawQuery(test, null); 

        startManagingCursor(mCursor);
        mCursor.moveToFirst();

        /**It crashes here**/String hwl = mCursor.getString(mCursor.getColumnIndex("_id"));

        doMessage(hwl);
        db.update("tbl_homework", args, "_id=34", null);
        fillData();
    }

02-06 12:13:49.789: I/Process(6112): Sending signal. PID: 6112 SIG: 9
02-06 12:13:55.582: D/dalvikvm(6140): GC_EXTERNAL_ALLOC freed 37K, 49% free 2785K/5379K, external 5211K/5218K, paused 23ms
02-06 12:13:58.785: D/AndroidRuntime(6140): Shutting down VM
02-06 12:13:58.785: W/dalvikvm(6140): threadid=1: thread exiting with uncaught exception (group=0x40091568)
02-06 12:13:58.796: E/AndroidRuntime(6140): FATAL EXCEPTION: main
02-06 12:13:58.796: E/AndroidRuntime(6140): android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
02-06 12:13:58.796: E/AndroidRuntime(6140):     at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
02-06 12:13:58.796: E/AndroidRuntime(6140):     at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
02-06 12:13:58.796: E/AndroidRuntime(6140):     at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41)
02-06 12:13:58.796: E/AndroidRuntime(6140):     at test.marco.notenha.homework$3.onClick(homework.java:227)
02-06 12:13:58.796: E/AndroidRuntime(6140):     at android.view.View.performClick(View.java:2486)
02-06 12:13:58.796: E/AndroidRuntime(6140):     at android.view.View$PerformClick.run(View.java:9130)
02-06 12:13:58.796: E/AndroidRuntime(6140):     at android.os.Handler.handleCallback(Handler.java:587)
02-06 12:13:58.796: E/AndroidRuntime(6140):     at android.os.Handler.dispatchMessage(Handler.java:92)
02-06 12:13:58.796: E/AndroidRuntime(6140):     at android.os.Looper.loop(Looper.java:130)
02-06 12:13:58.796: E/AndroidRuntime(6140):     at android.app.ActivityThread.main(ActivityThread.java:3703)
02-06 12:13:58.796: E/AndroidRuntime(6140):     at java.lang.reflect.Method.invokeNative(Native Method)
02-06 12:13:58.796: E/AndroidRuntime(6140):     at java.lang.reflect.Method.invoke(Method.java:507)
02-06 12:13:58.796: E/AndroidRuntime(6140):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
02-06 12:13:58.796: E/AndroidRuntime(6140):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
02-06 12:13:58.796: E/AndroidRuntime(6140):     at dalvik.system.NativeStart.main(Native Method)

Таблица: Строки: _id, hwdate, hw Val: "34", "05.02.12", "hy, xsdhagsah"

Ответы [ 2 ]

15 голосов
/ 06 февраля 2012

Просто это говорит о том, что ваш Cursor не имеет никакого значения, и все же вы пытаетесь прочитать с вашего Cursor.Таким образом, всегда лучше проверить значение cursor.getCount();

Log.d("Count",String.valueOf(cursor.getCount())); 
if(cursor.getCount() > 0){
// get values from cursor here
}
3 голосов
/ 06 февраля 2012

Вы выбираете столбец _id, но используете mCursor.getColumnIndex("hw"). В вашем выборе нет столбца hw, только _id. getColumnIndex() возвращает 0, вы получаете соответствующую ошибку.

UPD: Нет необходимости использовать getCount(). Позвольте мне поделиться некоторыми фрагментами кода. Во-первых, давайте предположим, что нам нужно только первое значение из курсора:

Cursor cursor = //query here
if (cursor.moveToFirst()) {
    // retrieve values from the cursor
}

Если нам нужно более одного значения:

Cursor cursor = //query here
while (cursor.moveToNext()) {
    // retrieve next set of values from the cursor
}

Начальная позиция курсора всегда -1, поэтому приведенный выше код будет работать и обрабатывать все записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...