2014-09-24 79 views
1

我想查詢sqlite數據庫並將選定的數據存儲到2d數組中。查詢sqlite數據庫並將選定的數據存儲到2d數組

我的問題是插入「WHERE字段='bordeaux'」到查詢導致錯誤,「android.database.CursorIndexOutOfBoundsExeption:索引1請求,大小爲1」。 沒有它,查詢和數組看起來工作得很好。

此外,我發現查詢「WHERE ...」只能刪除「c.moveToNext();」時只顯示一個適當的記錄。來自陣列部分。

可以肯定,我的sqlite數據庫包含足夠的數據匹配我的查詢。

對不起,我的不好解釋,但我只是不明白原因。 你能告訴我爲什麼?

我的代碼如下。

公衆的String [] [] onQuestion(){

mDbHelper = new MySQLHelper(this); 
    db = mDbHelper.getWritableDatabase(); 
    Cursor c = db.rawQuery("SELECT field, question, choice1, choice2, choice3, choice4, answer FROM WineQuiz WHERE field= 'bordeaux' ORDER BY RANDOM() LIMIT 5", null); 

    if(c.moveToFirst());{ 
        for (int ii = 0; ii < array.length; ii++) { 
        array[ii][0] = c.getString(c.getColumnIndex("field")); 
        array[ii][1] = c.getString(c.getColumnIndex("question")); 
        array[ii][2] = c.getString(c.getColumnIndex("choice1")); 
        array[ii][3] = c.getString(c.getColumnIndex("choice2")); 
        array[ii][4] = c.getString(c.getColumnIndex("choice3")); 
        array[ii][5] = c.getString(c.getColumnIndex("choice4")); 
        array[ii][6] = c.getString(c.getColumnIndex("answer")); 
        c.moveToNext(); 
        }       
     db.close(); 

    } 
    } 
     return array; 
} 
+0

Whiy做你在查詢中包含(並檢索)'field'?你已經知道它的價值('bordeaux')。我不會把**; **放在這裏:'if(c.moveToFirst()); {'。而且在我看來,還有一個**太多了。 – 2014-09-24 15:44:30

回答

1

你應該試試這個...

mDbHelper = new MySQLHelper(this); 
    db = mDbHelper.getWritableDatabase(); 
    int cPos; // for cursor position 
    Cursor c = db.rawQuery("SELECT field, question, choice1, choice2, " 
      + "choice3, choice4, answer FROM WineQuiz " 
      + "WHERE field= 'bordeaux' ORDER BY RANDOM() LIMIT 5", null); 
    if (c.getCount() > 0) { // If cursor has atleast one row 
     String[][] array = new String[c.getCount()][7]; // Dynamic string array 
     c.moveToFirst(); 
     do { // always prefer do while loop while you deal with database 
      cPos = c.getPosition(); 
      array[cPos][0] = c.getString(c.getColumnIndex("field")); 
      array[cPos][1] = c.getString(c.getColumnIndex("question")); 
      array[cPos][2] = c.getString(c.getColumnIndex("choice1")); 
      array[cPos][3] = c.getString(c.getColumnIndex("choice2")); 
      array[cPos][4] = c.getString(c.getColumnIndex("choice3")); 
      array[cPos][5] = c.getString(c.getColumnIndex("choice4")); 
      array[cPos][6] = c.getString(c.getColumnIndex("answer")); 
      c.moveToNext(); 
     } while (!c.isAfterLast()); 
    } else { 
     Log.e("SQL Query Error", "Cursor has no data"); 
    } 
+1

它的作品!非常感謝你!!我會用while while循環作爲你的建議。 – 2014-09-25 13:56:04

+0

這是我的樂趣 – 2014-09-26 14:02:53

1

是的,它看起來像你實際上並不返回五行......如果有的話。在if條件之後添加;使其無效。刪除;,以確保你沒有一個空指針,並且每增加一個迭代,你仍然可以有記錄前檢查:

if(c.moveToFirst()) { 
    for (int ii = 0; ii < array.length && !c.isAfterLast(); ii++) { 
     array[ii][0] = c.getString(c.getColumnIndex("field")); 
     array[ii][1] = c.getString(c.getColumnIndex("question")); 
     array[ii][2] = c.getString(c.getColumnIndex("choice1")); 
     array[ii][3] = c.getString(c.getColumnIndex("choice2")); 
     array[ii][4] = c.getString(c.getColumnIndex("choice3")); 
     array[ii][5] = c.getString(c.getColumnIndex("choice4")); 
     array[ii][6] = c.getString(c.getColumnIndex("answer")); 
     c.moveToNext(); 
    }       
} 
+0

感謝您的評論。它仍然只顯示一個數據。爲什麼我只能從我的數據庫中選擇一個數據?我的查詢有什麼問題嗎? – 2014-09-24 15:55:40

+0

你的數據庫裏有什麼? – 323go 2014-09-24 16:00:17

+0

我的sqlite數據庫有7列,id,字段,問題,choice1,choice2,choice3,choice4,答案。所有這些都是除id之外的文本,它是整數。行數爲19,在「字段」欄中有9行具有「波爾多」。我試圖從這9行中隨機取5行。 – 2014-09-24 16:07:36

相關問題