CursorIndexOutOfBounds异常:请求索引0,大小为0

时间:2017-07-27 09:29:54

标签: android cursor android-sqlite android-cursor

我尝试读取SQLite数据库列并将每个值存储在String数组中。我做了以下但它返回异常cursoroutofbounds。帮我弄清楚我做错了什么?

 public String[] getPlaces(){
        SQLiteDatabase db = this.getReadableDatabase();

        String [] columns = {"place1"};
        c = db.query("rates_table", columns, null, null, null, null, null);
        String[] places = new String[c.getColumnCount()];
        c.moveToNext();

        for(int i=0; i<c.getColumnCount(); i++)
            places[i] = c.getString(i);

        return places;

    }

4 个答案:

答案 0 :(得分:1)

这里:

String[] places = new String[c.getColumnCount()];

c.getColumnCount()将返回行中的count而不是number of rows in column。使用c.getCount()初始化places数组:

String[] places = new String[c.getCount()];

或使用ArrayList

答案 1 :(得分:1)

我已经锻炼了一段时间并找到了解决方案:

data: [{comment: "...", photo: ""},..]

答案 2 :(得分:0)

您需要在多个位置更改查询和进一步处理。将查询方法的第三个参数纠正为正确的where子句或将其保持为null。正确循环光标并将其添加到String。

public String[] getPlaces(){
    SQLiteDatabase db = this.getReadableDatabase();

    String [] columns = {"place1"};
    c = db.query("rates_table", columns, null, null, null, null, null);


    if (c.getCount() > 0) {   
       String[] places = new String[c.getCount()];
       int i=0;
       c.moveToFirst();
       do {
         places[i] = c.getString(c.getColumnIndex(0))); 
       } while (c.moveToNext());
       return places;
    }
    c.close();
    db.close();


}

答案 3 :(得分:0)

首先,您遇到c = db.query("rates_table", columns, "place1", null, null, null, null);

的问题

第三个参数将导致未选择任何行。

您可以使用c = db.query("rates_table", columns, null, null, null, null, null);,这将返回所有行。

或者您可以使用c = db.query("rates_table", columns, "place1 = 'myplace'", null, null, null, null);,在这种情况下,只会显示列place1中具有值myplace的行。

最佳实践方法是将第3和第4个参数结合使用,在第3个参数中使用占位符(例如&#34; place1 =?&#34;)和相应的参数在第4个参数中(例如new String [] {&#34; myplace&#34;}),所以要复制上一个查询,你可以c = db.query("rates_table", columns, "place1=?", new String[]{"myplace}, null, null, null);

使用c.moveToNext,将尝试移动到光标的下一行(最初是第一行)。但是,如果它不能移动(即没有行,如上所述),它将不会失败,而是返回false(如果可以移动光标,则为true)。

所以你需要检查这一点,否则,在没有行的情况下,尝试访问行将失败,并且Cursor超出索引请求的索引0,大小为0(即您请求第一个(索引0)当游标的大小(行数)为0时。

有多种方法可以检查。

但是我怀疑你会想知道为什么你的循环只显示1列。那是因为你在查询中说过只得到1列。

如果您将查询的第二个参数更改为null,则会获得所有列。

猜测你想要返回所有地方的数组。

假设这样: -

// get Cursor with all rows(3rd parm null) for the place1 column (2nd parm)
c = db.query("rates_table", columns, null, null, null, null, null);

// Create String array according to the number of rows returned.
String[] places = new String[c.getCount()];

// loop through all rows setting the respective places element with the 
// value obtained from the Cursor
while (c.moveToNext) {
    places[c.getPosition()] = csr.getString(csr.getColumnIndex("place1")); 
}

csr.close(); // Should always close a Cursor
return places;