SQLite IllegalStateException: где я могу закрыть базу данных? - PullRequest
2 голосов
/ 07 февраля 2012

При создании и заполнении моей новой базы данных SQLite в Android я получаю два противоречащих исключения.Вкратце мой код:

Класс расширения SQLiteOpenHelper:

public void onCreate(SQLiteDatabase db) {
    db.execSQL(DB_TABLE_CREATE);
    loadLevelData(db); //puts data in the database
    //db.close(); <<< ?
}

В своем классе активности я создаю экземпляр этого класса (в onCreate ()) и вызываю getWritableDatabase ():

dbHelper = new DbOpenHelper(getApplicationContext());
database = dbHelper.getWritableDatabase();  

Теперь, если я не позвоню db.close() после заполнения базы данных, как описано выше, я получу

android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the   cursor or database object that was opened here  

Однако, если я действительно закрою ее, я получу следующееисключение:

java.lang.IllegalStateException: database not open

в getWritableDatabase ().

Это действительно смущает меня, поэтому кто-нибудь может мне помочь с тем, что не так?

Ответы [ 2 ]

8 голосов
/ 07 февраля 2012

Вы не должны закрывать базу данных в классе DatabaseHelper. Однако вам нужно закрывать его каждый раз, когда вы открываете его, вызывая getWritableDatabase:

dbHelper = new DbOpenHelper(getApplicationContext());
database = dbHelper.getWritableDatabase();
//... do something with database
database.close();
2 голосов
/ 07 февраля 2012

Вы закрываете базу данных не в то время.

Я обычно держу базу данных примерно так:

public class MyActivity extends Activity {
    SQLiteDatabase writeableDb;

    // ... 
    // Code
    // ...

    public void onStart(){
        super.onCreate(savedState);
        // Do stuff, get your helper, etc
        writeableDb = helper.getWriteableDatabase();
    }

    public void onStop(){
        writeableDb.close();
        super.onStop();
    }
}

В качестве альтернативы, оберните весь ваш код, работающий с этим соединением БД, в блок try / finally

db = helper.getWriteableDatabase();
try { // ... do stuff ... }
finally { db.close(); }

Примечание: Все открытия / закрытия должны выполняться в Деятельности, работающей с базой данных, а не с открытым помощником.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...