Совместное использование базы данных sqlite между несколькими операциями Android - PullRequest
16 голосов
/ 13 октября 2009

Может ли два или более Android-операций открыть базу данных sqlite3 для записи?

У меня есть две операции, которые нужно вставить данные в одну базу данных sqlite. Когда второе действие вызывает SQLiteOpenHelper.getWriteableDatabase(), создается исключение IllegalStateException с сообщением « База данных SQLite создана и никогда не закрывается ».

Мне удалось избежать Исключения, сделав объект моей базы данных одиночным, но я думаю, что должен быть лучший способ.

Спасибо

John

Ответы [ 3 ]

14 голосов
/ 13 октября 2009

На самом деле никогда не может быть запущено более одного занятия одновременно. Самый простой способ исправить это - закрыть первое действие перед началом второго действия. Вы можете сделать это в onPause (), а затем снова открыть его в onResume (). Примерно так (очень псевдо-код):

MyActivity {
    OnResume()
        open connection to database
    OnPause()
        close connection to database
}

Таким образом, вы никогда не пытаетесь использовать более одного соединения одновременно, и соединение всегда доступно.

2 голосов
/ 01 июля 2010

У меня также есть несколько действий, и каждое действие открывает свое собственное соединение с базой данных. Я поддерживаю основное действие в то время, когда начинаю другие действия, и вызываю метод finish () для дочерних действий, когда они мне больше не нужны.

Я вижу, что дочерняя активность может успешно открыть соединение и запросить данные, пока основная Actitity все еще удерживает свой DBAdapter. Когда дочернее действие заканчивается, основное действие запрашивает все открытые курсоры. Кажется, это происходит автоматически.

Однако после некоторого нажатия на пользовательский интерфейс, который приводит к тому, что мое приложение запускается и завершает действия, я в конечном итоге получу исключение:

ERROR/Database(17657): Leak found
ERROR/Database(17657): java.lang.IllegalStateException:
      /data/data/yourpackage/databases/yourdatabase 
      SQLiteDatabase created and never closed
ERROR/Database(17657): at android.database.sqlite.SQLiteDatabase.<init>
     (SQLiteDatabase.java:1694)

Исключением является не действие, которое в данный момент находится на переднем плане, а то, что было завершено некоторое время назад. Итак, происходит то, что сборщик мусора очищает и находит соединение с открытой базой данных. Это не влияет на приложение - оно продолжает работать нормально, и все запросы из переднего плана Activity возвращают данные.

Решение состоит в том, чтобы просто закрыть соединение в дочернем Activity. Событие onDestroy () является подходящим местом для этого:

@Override    
protected void onDestroy() {        
    super.onDestroy();
    myAdapter.close();
}

Поскольку я включил это во все свои дочерние действия, я больше не получаю исключение.

0 голосов
/ 29 января 2018

Что бы я сделал, это определил базу данных в суперклассе, который является AppCompatActivity, если все действия расширяют этот класс, или определил его в классе Activity, который наследуется для всех действий.

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