我尝试读取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;
}
答案 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;