我不断收到此错误消息:"由以下引起:android.database.CursorIndexOutOfBoundsException:请求索引0,大小为0"在我的代码中。
我已经引用了以下链接,但它们都没有工作: Android cursor out of bounds exception
Cursor Index Out Of Bounds Error Android?
cursor index out of bounds exception
public Product getProduct(int id) {
db = this.getReadableDatabase();
Cursor cursor = db.query(
TABLE_NAME,
null,
COLUMN_ID + " = ?",
new String[] { Integer.toString(id)},
null, null, null, null);
Product product = new Product();
cursor.moveToFirst();
if (cursor != null) {
product.setID(cursor.getInt(0));
product.setName(cursor.getString(1));
product.setSize(cursor.getDouble(2));
product.setHp(cursor.getDouble(3));
product.setCategory(cursor.getString(4));
product.setPowerType(cursor.getString(5));
product.setExplosionProof(cursor.getInt(6));
product.setRPM(cursor.getInt(7));
product.setBypassPSI(cursor.getInt(8));
product.setGPM(cursor.getInt(9));
product.setPrice(cursor.getDouble(10));
cursor.close();
}
db.close();
return product;
}
以下是我的常数:
private static final String TABLE_NAME = "Products";
private static final String COLUMN_ID = "'_id'";
我非常感谢任何帮助。
现在,它不会进入if循环。我直接从另一个堆栈溢出问题得到了该查询模型。
答案 0 :(得分:0)
光标很可能是空的,因此您需要确定原因。可能是没有底层数据,或者可能是cursor where子句排除了所有数据。根据你提供的内容,无法确定原因。
我建议删除where子句以查看此更改是否重要。
即。而不是
Cursor cursor = db.query(
TABLE_NAME,
null,
COLUMN_ID + " = ?",
new String[] { Integer.toString(id)},
null, null, null, null);
使用: -
Cursor cursor = db.query(
TABLE_NAME,
null,
null,
null,
null, null, null, null);
这将返回游标中的所有行,如果这样做,则问题在于where子句(传递给db.query
的第3和第4个参数)。如果它没有解决问题,那么表本身可能没有行。
您可以使用: -
来规避CursorIndexOutOfBoundsException if (cursor.getCount() > 0) {
cursor.moveToFirst();
product.setID(cursor.getInt(0));
product.setName(cursor.getString(1));
product.setSize(cursor.getDouble(2));
product.setHp(cursor.getDouble(3));
product.setCategory(cursor.getString(4));
product.setPowerType(cursor.getString(5));
product.setExplosionProof(cursor.getInt(6));
product.setRPM(cursor.getInt(7));
product.setBypassPSI(cursor.getInt(8));
product.setGPM(cursor.getInt(9));
product.setPrice(cursor.getDouble(10));
} else {
// setup to return a product not found
}
cursor.close();
但是,这不会解决游标没有返回任何行的基本问题。
您可以使用以下内容来获取有关光标的更多信息(使用光标按照上面的更改选择所有行来运行)。这适用于任何游标: -
int rowcount = cursor.getCount();
String colnames = "";
for (String columns : cursor.getColumnNames()) {
colnames = colnames +
"Column Index=" +
Integer.toString(cursor.getColumnIndex(columns)) +
" Name=>" +
columns +
"< ";
}
Log.d("DBCHK","Table has " + Integer.toString(rowcount) + " rows. With columns:- " + colnames);
String values;
while (cursor.moveToNext()) {
values = "";
for (int i = 0; i < cursor.getColumnCount(); i++) {
values = values +
"Column = " +
cursor.getColumnName(i) +
" Index=" +
Integer.toString(i) +
" Value=" + cursor.getString(i) + ": ";
}
Log.d("DBCHK",values);
}
这会将数据写入日志: -
D/DBCHK: Table has 2 rows. With columns:- Column Index=0 Name=>_id< Column Index=1 Name=>myfloat<
D/DBCHK: Column = _id Index=0 Value=null: Column = myfloat Index=1 Value=56.7897:
D/DBCHK: Column = _id Index=0 Value=null: Column = myfloat Index=1 Value=87.7655:
每行会有一行,前面有一行列出了行数和列数。