【问题标题】:Querying sqlite database and store the selected data into 2d array查询sqlite数据库并将所选数据存储到二维数组中
【发布时间】:2014-11-19 04:38:26
【问题描述】:

我正在尝试查询 sqlite 数据库并将所选数据存储到二维数组中。

我的问题是在查询中插入“WHERE field='bordeaux'”会导致错误,“android.database.CursorIndexOutOfBoundsExeption:请求索引 1,大小为 1。” 没有它,查询和数组似乎运行良好。

另外,我发现当我删除“c.moveToNext();”时,带有“WHERE...”的查询只能显示一个合适的记录。从数组部分。

可以肯定的是,我的 sqlite 数据库包含与我的查询匹配的足够数据。

对不起,我的解释很糟糕,但我就是不明白原因。 你能告诉我为什么吗??

我的代码如下。

公共字符串[][] 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;
}

【问题讨论】:

  • 您为什么在查询中包含(并检索)field?您已经知道它的价值 (bordeaux)。我不会把 ; 放在这里:if(c.moveToFirst());{。在我看来,} 太多了。

标签: android arrays sqlite 2d querying


【解决方案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();
    }                          
}

【讨论】:

  • 感谢您的评论。它仍然只显示一个数据。为什么我只能从我的数据库中选择一个数据?我的查询有问题吗??
  • 您的数据库中有什么?
  • 我的sqlite数据库有7列,id、field、question、choice1、choice2、choice3、choice4、answer。除了 id 是整数之外,它们都是文本。行数为 19,其中 9 行在“字段”列中有“波尔多”。我正在尝试从这 9 行中随机获取 5 行。
【解决方案2】:

你应该试试这个...

    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");
    }

【讨论】:

  • 它有效!非常感谢!!我将使用 do while 循环作为您的建议。
猜你喜欢
  • 1970-01-01
  • 2013-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-19
  • 1970-01-01
  • 2016-03-18
  • 1970-01-01
相关资源
最近更新 更多