2010-08-02 5 views
11

Я создаю приложение для Android, которое представляет собой в основном список информации о грибах. Я получаю эту информацию из базы данных sqlite. У меня есть глобальный синглтон с классом услуг внутри него, в котором я использую доступ к моему db. Почти каждое действие получает доступ к db. Лучше ли оставлять свой db открытым все время или открывать и закрывать его, поскольку мне нужны данные?Доступ к базе данных в Android

Если наилучшая практика заключается в том, чтобы оставить ее открытой все время, где мне нужно, чтобы ее закрыть, и что такое худший сценарий, если я оставил его открытым, когда действие было уничтожено?

ответ

0

Основываясь на моем прошлом опыте в Java, я бы сказал, что лучше закрыть соединение, это, вероятно, не имеет значения в небольшом приложении для Android, но если у вас 10 приложений, и все они обращаются к базе данных, вы имеют 10 ожидающих соединений. Начните еще несколько, и рано или поздно другому приложению придется ждать, потому что SQL-сервер не может обрабатывать больше запросов.

Я думаю, вы могли бы подумать об этом как о файле на своем компьютере. Вы читаете данные из него, а затем закрываете его, когда делаете это. Зачем хранить файл в своем приложении?

Теперь я очень новичок в программировании на Android, поэтому мне не удалось реализовать вызовы базы данных. Но когда я столкнулся с той же проблемой в Java-приложении несколько лет назад, я реализовал объект базы данных, в котором у меня было соединение с базой данных. «Все остальные» (классы) должны были вызвать объект базы данных (singleton или final methods) для получения данных, вроде хранимых процедур, но в приложении.

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

В основном я отвлек SQL-запросы, используя методы как public Fungus[] getAllFungus() и public Fungus[] getFilteredFungus(string where).

+0

Если вы используете базу данных в Android, вы должны использовать 'SQLiteOpenHelper' или' ContentProvider' для управления вашими подключениями. Затем вы можете вернуть 'Cursor', который позволяет вам перебирать результирующий набор или легко размещать его в списке. –

1

Я бы открыл db по мере необходимости. Таким образом, вы точно знаете, что соединение закрывается после завершения определенного действия, которое его открыло. Хотя Android имеет встроенные проверки, чтобы убедиться, что он закрывается при завершении работы приложения, он не боится быть в безопасности. Я также предполагаю, что его открытие все время может вызвать утечки или что-то в этом роде.

+0

Ну, я открываю дБ, используя его, а затем закрываю, как только я закончил. Я снова открываю onResume и закрываю onPause (и onDestroy), когда начинаю другое действие. Новая деятельность ведет себя одинаково. Когда я уничтожаю текущую активность и возвращаюсь к предыдущему экрану, мой адаптер пытается подключиться к db, прежде чем вызывается onResume, и я получаю исключение «что-то о fillWindow». –

+0

Хорошо Чтобы исключить исключение fillWindow перед вызовом getWritable Базы данных на вашем объекте обработчика объекта dboject близко к нему, вероятно, закрывайте его onFinish или onStop. –

+0

Вы сказали, что закрыли его наDestroy. Возможно, onDestroy вызывается после onResume другого вида деятельности. Это заставит ваш глобальный db закрыть то, что вам не нужно :) – Moncader

10

Ваш лучший вариант здесь - рефакторинг, чтобы ваше приложение обращалось к базе данных через ContentProvider. Реализация ContentProvider - это единственное, с открытием дескриптора базы данных.

Это дает несколько преимуществ:

  • только одна вещь имеет базу данных с открытым, так что ваша проблема просто уходит.
  • множество стандартных классов поддержки для автоматизации управления базами данных.
  • лучшая интеграция со стандартными представлениями управления списками Android, которые предназначены для автоматической работы с курсорами, предоставляемыми ContentProviders.
  • Все ваши данные могут быть адресованы URI (как правило, из содержимого формы: //com.fnord.mushroom/mushroom/43 '), что означает, что другие приложения также могут получить доступ к вашим данным.

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

С отрицательной стороны ContentProviders только действительно поддерживают доступ через ограниченный интерфейс - в терминах SQL вы получаете INSERT, SELECT, UPDATE и DELETE без вложенных предложений. Если вы делаете сложный SQL-материал, может быть немного больно направлять запросы из вашего приложения в ContentProvider и обратно. Тем не менее, большинству людей не нужно это делать (и если вы это сделаете, то намеренные намерения - это путь).

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