Доступ к базе данных в Android - PullRequest
11 голосов
/ 03 августа 2010

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

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

Ответы [ 3 ]

10 голосов
/ 06 августа 2010

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

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

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

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

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

1 голос
/ 03 августа 2010

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

0 голосов
/ 10 августа 2010

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

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

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

Из-за этого я знал, когда вызовы гдесделал и когда они остановились.Затем я установил тайм-аут, чтобы через несколько минут ничего не произошло, я бы закрыл соединение с БД.(Это также позаботилось о некоторых исключениях тайм-аута, потому что тайм-аут соединения никогда не произойдет.) Когда будет введен новый вызов, я мог легко установить новое соединение и использовать новое соединение дб.В вызовах SQL используются методы типа public Fungus[] getAllFungus() и public Fungus[] getFilteredFungus(string where).

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