1

我在我的 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)抛出以下异常(变量测试为 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
4

1 回答 1

3

这意味着你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>)获取列索引的方法。这种方法更安全,更易于阅读。

于 2013-07-19T09:00:24.883 回答