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)は次の例外をスローします (変数 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
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が空でない場合にのみ、コードは正しく機能します。2番目のケースでは機能しません。

注:getColumnIndex(<columnName>)その名前から、列インデックスを取得するメソッドを使用することをお勧めします。この方法はより安全で、人間が判読できます。

于 2013-07-19T09:00:24.883 に答える