cursor.getString()抛出的CursorIndexOutOfBoundsException

时间:2013-07-19 08:52:59

标签: android sqlite exception cursor android-cursor

我在我的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

1 个答案:

答案 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>)方法获取列索引,因为它的名称。这种方法更安全,更易于阅读。