Совместное использование базы данных sqlite между несколькими действиями Android

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

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

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

Благодаря,

Джон

Solutions Collecting From Web of "Совместное использование базы данных sqlite между несколькими действиями Android"

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

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

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

У меня также есть несколько видов деятельности, и каждое действие открывает собственное соединение с базой данных. Я сохраняю основную активность активным, пока я начинаю другие действия, и я вызываю 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) 

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

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

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

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