2014-09-24 55 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

相关问题