2012-02-06 88 views
3

我不知道爲什麼我的光標是空的。我讀了其他4-5個包含相同信息的問題,但我無法解決我的問題。我忘了什麼?光標崩潰:請求索引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); 
     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"); 
     } 
    } 

有了這個代碼,我得到了crach ...安卓指數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」

+1

你的第一個方法是好的。看起來數據庫中沒有任何數據與你的條件有關。所以你需要寫查詢爲String test =「SELECT * FROM tbl_homework where hw ='」+ txt_edit_hw +「';」;再次如果你沒有得到結果檢查你的數據庫或在edit_hw.getText()。toString()之後使用.trim()。 PS:不要使用getcount(),不需要這樣做。 – 2012-02-06 10:39:49

+0

當我使用txt_edit_hw.trim()時出現同樣的錯誤;我檢查了我的數據庫;)有一些條目第一個是_id = 34. – 2012-02-06 11:10:34

+0

您確定您的where語句是否正確,選擇是否爲空? – Ash 2012-02-06 11:29:28

回答

11

簡單地說,您的Cursor沒有任何價值,仍然嘗試閱讀從你的Cursor。因此,它始終是更好地檢查cursor.getCount();

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

getCount()方法? – 2012-02-06 10:36:42

+0

@Lalit Poptani謝謝你的回答,但我不想知道如何檢查我的光標中的值。我想知道爲什麼沒有什麼... 添加了一些有問題的代碼...相同的錯誤 – 2012-02-06 11:03:17

+0

要獲得有關您的問題的確切想法,應該將Logcat輸出添加到問題以及表格字段中。 – 2012-02-06 11:06:58

3

值您選擇_id列,但您使用mCursor.getColumnIndex("hw")。在您的選擇中沒有列hw,只有_idgetColumnIndex()返回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

謝謝,我確定這是正確的。但仍然有同樣的錯誤。 我在我的問題中發佈了一些代碼。 – 2012-02-06 11:04:40

相關問題