カーソルがクラッシュしています:要求されたインデックス0、サイズ0

なぜ私のカーソルが空であるのかわかりません。私は同じメッセージを含む他の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が要求され、サイズは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"

3
あなたの最初のアプローチは良いです。あなたのどこの条件に関連するデータベースにもデータが存在しないようです。だから、あなたは文字列test = "SELECT * FROM tbl_homework where hw = '" + txt_edit_hw + "';"というようにクエリを書く必要があります。再度結果が得られなかった場合は、データベースを確認するか、edit_hw.getText()。toString()の後に.trim()を使用してください。 PS:getcount()を使わないでください。これを行う必要はありません。
追加された 著者 Pankaj Kumar,
txt_edit_hw.trim()を使用すると同じエラーが発生します。そして私のデータベースをチェックしました;)最初に_id = 34というエントリがいくつかあります。
追加された 著者 Marco Seiz,
私はそれが正しいと思う。私は何が間違っているのか分からない...
追加された 著者 Marco Seiz,
where 句が正しいこと、選択が空でないことは確かですか?
追加された 著者 Ash,

2 答え

Simply it says that your Cursor is not having any value and still you are trying to read from your Cursor. So, its always better to check the value of cursor.getCount();

Log.d("Count",String.valueOf(cursor.getCount())); 
if(cursor.getCount() > 0){
// get values from cursor here
}
14
追加された
あなたの問題についての正確な情報を得るには、Logcatの出力を質問とテーブルのフィールドに追加する必要があります。
追加された 著者 Lalit Poptani,
あなたが Log.d( "Count"、cursor.getCount()+ ""); のために何を得たのですか? 0の場合は、カーソルに値がないことを意味します。
追加された 著者 Lalit Poptani,
正しいクエリを書くことによって:)
追加された 著者 Lalit Poptani,
hbl = 'string_you_have_in_database' のtbl_homeworkから select _idのようなStatic selectクエリを使用して、取得しようとしてみてください。
追加された 著者 Lalit Poptani,
getCount()メソッド?
追加された 著者 Pankaj Kumar,
@Lalit Poptani答えに感謝しますが、私はCursorで値をチェックする方法を知りたくありません。私はなぜ何もないことを知りたいです...問題のコードを追加しました...同じエラー
追加された 著者 Marco Seiz,
@LalitPoptaniテーブルフィールドとLogCat出力が追加されました。ありがとう
追加された 著者 Marco Seiz,
はいカウントは0です。カーソルに値を追加するにはどうすればよいですか? o_O
追加された 著者 Marco Seiz,
さて、私はそれを試しました。しかし私は自分の間違いを理解することはできません。あなたは正しいものを書くのを助けてくれますか?ありがとう
追加された 著者 Marco Seiz,
やめろ!私は文字列を '' ...に入れる必要がありますDあなたは素晴らしいですね!
追加された 著者 Marco Seiz,

_id 列を選択しますが、 mCursor.getColumnIndex( "hw")を使用します。選択項目には _id のみの列 hw はありません。 getColumnIndex() 0 を返した場合、対応するエラーが発生します。

UPD: There is no need to use getCount(). Let me share some code snippets. Firstly, let's assume that we need only the first value from the cursor:

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 です。そのため、上記のコードはすべてのエントリを処理して処理します。

3
追加された
ありがとう、私はそうだと確信しています。しかし、まだ同じエラーがあります。私は私の質問にいくつかのコードを掲載しました。
追加された 著者 Marco Seiz,