Подтвердить что ты не робот

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

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

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

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

Спасибо,

Джон

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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