2009-07-10 65 views
2

我創建了下面的方法從數據庫中檢索存儲的設置:安卓:從數據庫問題檢索數據

public String getEntry(long rowIndex){ 
    String value = ""; 

    Cursor c = db.query(DATABASE_TABLE, new String[] {KEY_NAME, VALUE}, KEY_NAME + "=" + rowIndex, null, null, null, null); 
    int columnIndex = c.getColumnIndex(VALUE); 
    int rowsCount = c.getCount(); 
    if(rowsCount > 0){ 
     String value = c.getString(columnIndex); 
    } 

    return value; 
} 

在調試,我可以看到光標C包含兩列,一列,但是當涉及到線

String value = c.getString(columnIndex); 

它拋出CursorIndexOutOfBoundsException雖然columnIndex = 1,這應指向一個有效輸入。

有沒有人知道這裏會出現什麼問題?

回答

4

我不知道你使用的DB-Wrapper,但我想做兩個猜測,因爲我知道Sqlite有點。

這既可以是:

  1. 在我的包裝,並在C-API,有必要做一個步驟(或下)要檢索數據的每一次。你的例外表明,你沒有定位在正確的行。所以你可以嘗試一下「下一步」或「步驟」(DB-Wrapper所能理解的)。

  2. 這個c.getCount()也可能帶來麻煩。 getCount可以做什麼,指望光標?它可以迭代遊標直到完成。發生這種情況時,光標用盡,只能重做整個事情。在這一點上閱讀會拋出你得到的東西。爲了避免這個問題而不需要兩次讀取表格,您應該自己讀取所有行並自己進行計數。在你的DB-Wrapper中應該有方法(比如拋出的異常或狀態),你可以檢查你的遊標是否已經耗盡。

當我理解你的DB包裝的權利,其中之一可能是問題。

+1

我壞請求必須添加調用moveNext()。 Thaks很棒! – 2009-07-10 08:32:22

2

你需要閱讀的價值之前,將光標移動到第一行與c.moveToNext():

public String getEntry(long rowIndex) { 
    String value = ""; 

    Cursor c = db.query(DATABASE_TABLE, new String[] { KEY_NAME, VALUE }, 
      KEY_NAME + "=" + rowIndex, null, null, null, null); 

    int columnIndex = c.getColumnIndex(VALUE); 
    if (c.moveToNext()) { 
     value = c.getString(columnIndex); 
    } 

    return value; 
} 
2

我剛纔創建了一個數據庫。其中有兩個字段名,NUM。

當我想從這個數據庫使用遊標檢索數據時發生了一些錯誤。 但我可以使用getCount將()從返回的光標 這裏計數d行是我的代碼:

Cursor c=myDB.query(MY_DATABASE_TABLE,null,null,null,null,null,null); 
    Log.d("cursor",Integer.toString(c.getCount())); 

    if (c.moveToFirst()) 
{ 

do{ 
     String data = c.getString(c.getColumnIndex("name")); 

        Log.v("yo",data); 

       }while(c.moveToNext()); 

} 

誤差爲字段時隙0,-1 numRows行= 5,= numColumns列2