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

Доступ к базе данных в Android

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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