2014-12-07 2 views
-1

Я получаю сообщение об ошибке в моем классе операций sqlite db.получение исключения в методах работы базы данных sqlite в android

Ошибка заключается в следующем: java.lang.IllegalStateException: попытка повторно открыть уже замкнутый объект:

Мой код выглядит следующим образом:

public void incrementViewCountForShow(String showId){ 

    SQLiteDatabase db = this.getWritableDatabase(); 

    showViews(showId); 

    String query = "UPDATE " + TABLE_SHOWS + " SET " + COLUMN_SHOW_VIEWS + "=" + COLUMN_SHOW_VIEWS + "+1" + " WHERE " + COLUMN_SHOW_ID + "=" + showId ; 

    db.rawQuery(query, null); 

    showViews(showId); 

    db.close(); 

} 

private void showViews(String showId){ 

    boolean isFirst = true; 
    StringBuilder strBuilder = new StringBuilder(); 
    SQLiteDatabase db = this.getReadableDatabase(); 
    String query = "SELECT " + COLUMN_SHOW_NAME_EN + "," + COLUMN_SHOW_VIEWS + " FROM " + TABLE_SHOWS + " where " + COLUMN_SHOW_ID + "=" + showId; 
    Cursor cursor = db.rawQuery(query, null); 

    if (cursor != null) { 

     while (cursor.moveToNext()) { 

      strBuilder.append(cursor.getString(0)); 

     } 
    } 

    cursor.close(); 
    db.close(); 
} 

Что является причиной этой ошибки ? Как это исправить?

** Мы не можем сделать две операции в том же методе? (Чтение из БД дважды)

Благодарности

ответ

2

Что является причиной этой ошибки?

Вы звоните close() по номеру SQLiteDatabase несколько раз.

Как это исправить?

Не называть close() на SQLiteDatabase несколько раз. На самом деле, вы не должны звонить close() на SQLiteDatabase. Вместо этого позвоните по номеру close() по номеру SQLiteOpenHelper и сделайте это только при полностью выполненном с SQLiteOpenHelper.

Кроме того, как отмечает Der Golem, используйте execSQL(), а не rawQuery(), для операторов SQL, которые не возвращают набор результатов.

+0

спасибо за быстрый ответ. Я создал db и реализовал все методы доступа db в том же классе. Каким будет лучший способ использования sqlite db в android? – chathura

+0

@ chathura2020: Нет единого «лучшего» способа. Но не закрывайте свой 'SQLiteOpenHelper' (и, следовательно, его' SQLiteDatabase') до тех пор, пока вы не закончите с ним полностью. – CommonsWare

2

db.rawQuery(query, null); используется только для запросов (SELECT). Для команд (INSERT, UPDATE, DELETE, CREATE TABLE ...), используйте db.execSQL(query, null);

И удалить db.close(); линию в showViews()

Смежные вопросы