2012-02-06 10 views
3

カーソルが空である理由がわかりません。私は同じメッセージを含む他の4-5の質問を読んだが、問題を解決できなかった。私は何を忘れましたか?このコードではカーソルがクラッシュしています:0のサイズでインデックス0が要求されました

私がメッセージだ:「カーソルが空である」:私はcrachを得た。このコードで

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 ヴァル: "34"、 "05/02/12"、 "HY、xsdhagsah"

+1

あなたの最初のアプローチは良いです。あなたのどこの条件に関連するデータベースにもデータが存在しないようです。だから、あなたは文字列test = "SELECT * FROM tbl_homework where hw = '" + txt_edit_hw + "';"というようにクエリを書く必要があります。再度結果が得られなかった場合は、データベースを確認するか、edit_hw.getText()。toString()の後に.trim()を使用してください。 PS:getcount()を使わないでください。これを行う必要はありません。 –

+0

txt_edit_hw.trim()を使用すると同じエラーが発生します。そして私のデータベースをチェックしました;)最初に_id = 34というエントリがいくつかあります。 –

+0

'where'句が正しいこと、選択が空でないことは確かですか? – Ash

答えて

11

は、単にそれはあなたのCursorは、任意の値を持っていない、まだあなたが読みしようとしていると述べていますCursorからだから、その常により良いあなたが_id列を選択し、まだあなたがmCursor.getColumnIndex("hw")を使用cursor.getCount();

Log.d("Count",String.valueOf(cursor.getCount())); 
if(cursor.getCount() > 0){ 
// get values from cursor here 
} 
+0

getCount()メソッド? –

+0

@Lalit Poptani答えに感謝しますが、私はCursorで値をチェックする方法を知りたくありません。私はなぜ何もないことを知りたいです... 問題のコードを追加しました...同じエラー –

+0

あなたの問題についての正確な情報を得るには、Logcatの出力を質問とテーブルのフィールドに追加する必要があります。 –

3

の値をチェックします。あなたの選択に列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です上記のコードはすべてのエントリを処理して処理します。

+0

ありがとう、私はそうだと確信しています。しかし、まだ同じエラーがあります。 私の質問にいくつかのコードを掲載しました。 –

関連する問題