Tutorial Android #11 – Persistência em Banco de Dados

Olá leitores! No post de hoje, vamos criar um sistema de persistência para a nossa Lista de Restaurantes. Assim, os restaurantes cadastrados serão mantidos a cada execução do aplicativo.

O sistema Android nos fornece nativamente as opções de persistir dados utilizando arquivos ou em banco de dados, utilizando o SQLite. Se você não conhece o projeto, é interessante dar uma lida sobre ele. É um banco de dados bastante leve, que nos permite facilmente trabalhar com SQL sobre um arquivo.

Neste tutorial, estou assumindo que você tenha um conhecimento básico em SQL (apesar de eu nunca ter tratado deste assunto aqui no blog). Se você nunca mexeu com isso, não se preocupe, pois os conceitos não são complicados de entender :).

Bom, começando o nosso tutorial, vamos criar uma classe que gerenciará a criação e abertura do nosso banco de dados. Vamos chamá-la de GerenciadorRestaurantes. Coloque-a no pacote net.rafaeltoledo.restaurante.

A princípio, definimos que nosso banco de dados será armazenado no arquivo restaurantes.db e que utilizaremos a primeira versão do schema do banco. Neste ponto o projeto ainda deve compilar sem problemas.

Em seguida, vamos implementar o método onCreate() para que ele crie o nosso banco de dados.

Neste trecho simplesmente criamos a tabela restaurantes com seus campos. O método onUpgrade() não será útil para nós por enquanto. Em um aplicativo real, você poderia implementá-lo para fazer backup dos dados em uma tabela temporária, atualizar a estrutura do banco e então retornar os dados.

O próximo passo é remover partes do código da classe ListaRestaurantes que não nos serão úteis daqui pra frente (como os trechos que manipulam a nossa barra de progresso). As primeiras exclusões são os atributos estaAtivo  e progresso. Em seguida, podemos remover a chamada ao método requestWindowFeature() dentro do método onCreate(). Podemos também excluir as implementações dos métodos onPause(), onResume(), onCreateOptionsMenu() e onOptionsItemSelected(). Por fim, podemos excluir também os métodos iniciarTarefa(), fazerAlgoDemorado() e a nossa tarefaLonga.

A classe GerenciadorRestaurantes será a nossa ponte entre a aplicação e o banco de dados. Dessa forma, vamos criar um atributo na classe ListaRestaurantes chamado gerenciador do tipo GerenciadorRestaurante.

Lá no método onCreate(), após a chamada a setContentView(), vamos então instanciar o atributo:

Complementando, implemente o método onDestroy() na classe ListaRestaurantes.

Nós vamos agora, substituir nosso objeto de modelo (e seu ArrayList associado) pelo banco de dados, utilizando também a classe Cursor do Android para controlar as instâncias. Primeiramente, vamos adicionar o método inserir() na classe GerenciadorRestaurantes:

Neste método, recebemos os valores individuais dos campos que compõem a classe Restaurante e adicionamos a um objeto ContentValues, relacionando os valores com as colunas da tabela do nosso banco de dados. Por fim, obtemos uma instância do banco para escrita e inserimos os valores na tabela restaurantes.

Agora, devemos realizar a chamada a este método ao pressionarmos o botão Salvar em nosso formulário (onSave).

Em seguida, vamos fazer com que a listagem de restaurantes seja realizada a partir do nosso banco de dados. Se você já mexeu com banco de dados no Java, já deve ter visto o funcionamento de um ResultSet. Ele armazena o conteúdo de uma consulta ao banco de dados. No Android, utilizamos a classe Cursor que tem funcionamento semelhante.

Assim, vamos criar um método na classe GerenciadorRestaurantes para obter a lista de restaurantes salvos no banco. Vamos implementar o método obterTodos():

Precisaremos também de métodos que nos forneçam acesso a determinados campos do Cursor. Dessa forma, adicione estes métodos à classe GerenciadorRestaurantes:

Na nossa implementação atual, a classe Adaptador estende a classe ArrayAdapter, de forma que ela não conseguirá manipular os dados contidos no Cursor. Assim, modificaremos sua implementação para, então, estender não mais ArrayAdapter, mas sim CursorAdapter.

Como pode ser percebido, a classe ArmazenadorRestaurante também necessita de alguns ajustes, para manipular o objeto da classe Cursor. Mas antes, vamos modificar o atributo listaRestaurantes do tipo List para Cursor.

Agora, no método onCreate(), substitua o código que populava o antigo ArrayList por este:

Prosseguindo (calma, já tá quase acabando!), vamos atualizar a classe ArmazenadorRestaurante para trabalhar com o Cursor:

Por fim, vamos modificar todas as referências ao ArrayList que tínhamos no nosso onListClick.

Como último passo precisamos adicionar uma linha para que a lista seja atualizada a cada inserção. Insira a seguinte linha após a inserção lá no onSave:

Pronto! Você já pode executar a sua versão persistente do Lista de Restaurantes!

Segue a listagem completa da classe ListaRestaurantes:

… e GerenciadorRestaurantes

Se você perdeu alguma parte, pode baixar o projeto aqui.

Até a próxima! 🙂

8 comentários sobre “Tutorial Android #11 – Persistência em Banco de Dados

  1. Amigo, show de bola o seu tutorial.
    Pelo que olhei o seu código é possível listar todas as entradas do banco de dados e ainda personalizar o layout onde elas serão listadas, o que é exatamente o que estou procurando.

    Valeu!

    Curtir

  2. Fabiano disse:

    Boa tarde, acho que estou fazendo alguma coisa errada. Não estou conseguindo executar o Select do exemplo. Sempre aparece um erro dizendo que a coluna _id não existe. Poderia me ajudar por favor?

    Curtir

  3. Eduardoxvii disse:

    Tire-me uma dúvida desse trecho: getWritableDatabase().insert(“restaurantes”, “nome”, valores);

    “nome”: Porque você colocou a string nome nesse parametro? O que ela faz?

    De qualquer forma obrigado

    Curtir

  4. Kelry Fernandes disse:

    Muito bacana, mas como seria feito no caso de ter informações no banco local e precisar enviar/Post deles para outro banco, e ele trabalhar em background até que haja conexão com a internet ?

    Curtir

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

Este site utiliza o Akismet para reduzir spam. Saiba como seus dados em comentários são processados.