Qual a melhor forma de lidar com os Databases no Android

Qual a melhor forma de lidar com os Databases do sqlite? Pegar um novo e fechá-lo a cada comando SQL ou pegar um writeable ao inicializar a aplicação e mantê-lo aberto fechando-o ao finalizar a aplicação?

 

Primeiro, quando você está usando um banco de dados SQLite no Android , o que se recomenda fazer é, ao invés de tentar implementar o banco do zero, use um SQLiteOpenHelp , assim muita coisa vai ser feita automaticamente para o desenvolvedor.

 
Assim você conseguirá pegar o um objeto WritableDatabase, utilizando o getWritableDatabase(). A dica é a seguinte, você manter um banco de dados aberto gasta bastantes recursos, porém ficar abrindo e fechando o banco de dados vai gastar bastante tempo, então você acaba ficando no dilema performance X maior uso de memória.

 
Uma coisa que deve ser feita é unificar o acesso do banco de dados de seu aplicativo, ou seja, ao invés de em toda classe você ficar acessando o banco de dados, procure centralizar todo o acesso ao banco de dados em uma classe só e se possível dentro de um Service, se para sua aplicação fizer sentido.

 
Utilizando esse acesso centralizado, além de ficar mais fácil debugar, torna menos árdua a tarefa de determinar quando você fecha o banco de dados e quando você abre. Por exemplo, se seu aplicativo foi para o background e ele faz apenas iterações com o usuário , não faz sentido nenhum você ficar com banco de dados aberto, sendo assim quando seu aplicativo notar que vai para background o ideal é que ele feche todas as conexões com o banco de dados, assim ele ganhará o troféu cidadania do Android, porque ele irá liberar recursos para outros aplicativos.

 
Caso seu aplicativo utilize um Service que realize constantes consultas em tabelas, neste caso não vale a pena seu aplicativo ficar dando close toda hora. Em qualquer hipótese é importante lembrar que se você está utilizando o SQLiteOpenHelper, é aconselhável que sua aplicação não dê close nos bancos de dados que ele retorna, pois o SQLiteOpenHelper que está gerenciando essa conexão, quando você recebe uma referência, ela é simplesmente emprestada, então não dê close nessa referência isso pode gerar um erro, pois o banco de dados será fechado duas vezes.

 
Outra dica importante, e que muitos desenvolvedores erram, é tentar abrir o DB da Main Thread de sua aplicação, mesmo que essa operação pareça simples e rápida, toda operação de IO deve ser considerada demorada e pesada, pois o SQLite pode, deliberadamente, estar organizando os indexes e tabelas, isso provavelmente levará alguns segundos.

 
Se sua aplicação estiver fazendo uma consulta exatamente durante o processo de reindexação, o usuário vai receber o erro dizendo que aplicação não está respondendo. Então se você vai fazer qualquer operação pesada ou potencialmente pesada o lugar certo para isso é fora da Main Thread

 

 

Texto Adaptado do video  de
Bruno Oliveira - Google Developer Relations
durante a Android Developer Office Hours do Brasil