我在我的sqlite数据库中使用一个配置表。其结构如下:
private static final String DATABASE_CONFIG_CREATE =
"CREATE TABLE " + TABLE_CONFIGS
+ "("
+ CONFIG_HIDDEN_CATEGORIES + " TEXT DEFAULT '1,2' NULL"
+ ");";
稍后我尝试使用以下代码访问:
Cursor cursor = database.query(DatabaseHelper.TABLE_CONFIGS, new String[] {DatabaseHelper.CONFIG_HIDDEN_CATEGORIES}, null, null, null, null, null);
try {
cursor.moveToFirst();
int test = cursor.getCount();
String data = cursor.getString(0);
}
catch (Exception exception) {
但是行cursor.getString(0)
抛出以下异常(变量test为0):
android.database.CursorIndexOutOfBoundsException:请求索引0, 大小为0
当我运行以下代码时,向我显示了列CONFIG_HIDDEN_CATEGORIES
...出了什么问题?
Cursor dbCursor = database.query(DatabaseHelper.TABLE_CONFIGS, null, null, null, null, null, null);
String[] columnNames = dbCursor.getColumnNames(); // index 0 is the value of CONFIG_HIDDEN_CATEGORIES
答案 0 :(得分:2)
这意味着您的Cursor
为空。你应该将你的行动包装到正确的条件:
try {
if (cursor.moveToFirst()) {
String data = cursor.getString(cursor.getColumnIndex("columnName"));
// do your stuff
}
else {
// cursor is empty
}
}
...
您的实际代码无法正常运行,因为您只是调用moveToFirst()
方法,但如果它返回true或false,则您不知道(没有测试)。
仅当Cursor
不为空时,您的代码才能正常运行。在第二种情况下,它将无法工作。
注意:我建议您使用getColumnIndex(<columnName>)
方法获取列索引,因为它的名称。这种方法更安全,更易于阅读。