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

最佳答案

这意味着您的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>)方法获取列索引。此方法更安全,更易于理解。

10-04 13:57