Persistindo Dados no Android com a Room

Quando o assunto é persistência de dados no Android, logo vem o SQLite na mente do desenvolvedor Android. Porém, trabalhar com esse banco de dados de forma direta é muito ineficiente. Para contornar essa dificuldade, o que muitos desenvolvedores fazem é recorrer às bibliotecas ORM (Object Relational Mapping) que abstraem o uso do SQLite como a Active Android (está depreciada atualmente) e a ORM Lite.

Diante da necessidade de novas alternativas para o armazenamento de dados no Android, no Google IO de 2017, a Google realizou o lançamento da Room. Essa biblioteca fornece uma camada de abstração sobre o SQLite para permitir um acesso mais robusto ao banco de dados. É importante ressaltar que a Room faz parte de um conjunto de componentes de software para Android que a Google nomeou de Android JetPack.

Neste post, irei demonstrar como utilizar a Room no seu projeto Android. Para isso, será desenvolvido um projeto em Kotlin onde cadastraremos e limparemos uma lista de carros, a qual será exibida em um TextView (Não vou usar RecycleView para não complicar o exemplo).

Sem mais blá blá blá… Vamos programar!

O primeiro passo é importar a biblioteca Room no gradle da pasta app e sincronizá-lo.

Com a biblioteca importada, precisamos entender sua arquitetura. Basicamente, a Room é composta por três componentes:

  • Entity: Representa a tabela no banco de dados.
  • DAO: Contém os métodos usados para acessar o banco de dados.
  • Database: Contém o mantenedor do banco de dados e serve como o principal ponto de acesso para a conexão aos dados.

A imagem abaixo mostra como esses componentes se relacionam.

Agora que a arquitetura já é conhecida, precisamos implementar cada um dos componentes. O primeiro deles será a nossa entidade Car, a qual representará a tabela Car em nosso banco de dados. É importante observar que a Room necessita do uso de anotações na implementação de seus componentes.

Como mostra o código abaixo, para representar uma entidade, a Data Class deve estar associada à anotação @Entity. Além disso, a Room exige que exista pelo menos uma primary key na classe.

Para manipularmos os dados da tabela Car presente no banco de dados, definiremos uma interface com as assinaturas dos métodos. Essa interface deve ser associada à anotação @Dao e, apesar de existirem anotações como @Insert e @Delete, as assinaturas dos métodos podem conter comandos em SQL através do uso da anotação @Query.

Por fim, implementaremos uma classe Database, a qual servirá como conexão ao banco de dados. Essa classe deve estender a RoomDatabase e utilizar o padrão Singleton para que possamos fazer uso de uma mesma instância para acessar a base de dados.

Com os principais componentes já construídos, o próximo passo é criarmos uma Activity e a interface gráfica para testarmos o funcionamento da Room. Essa Activity fará uso de AsyncTask para que as ações junto ao banco de dados possam ser executadas, umas vez que esse tipo de tarefa não pode ser realizado na UI Thread.

No código acima é possível notar a presença de três AsyncTasks. A InsertCarTask é responsável pela execução da inserção de um novo carro no banco de dados. O nome desse novo carro é composto pela palavra “Car” seguida do ID do último carro salvo incrementado de 1. Por sua vez, o DeleteAllTask é utilizado para deletar todos os registros contidos no banco de dados. Por fim, UpdateViewTask serve para atualizar o TextView com todos os registros persistidos na base de dados.

Para “chamar” as AsyncTasks foram incorporados botões na Activity como mostra a imagem abaixo:

Na imagem seguinte é possível ver a lista de dados construída após sucessivos cliques no botão “Inserir Carro”.

Bom, é isso. Espero que você tenha entendido como a biblioteca Room funciona e consiga utilizá-la nos seus futuros projetos. =)

O código-fonte completo do projeto desenvolvido neste post pode ser acessado no GitHub: Exemplo Room.

Qualquer dúvida, deixa um comentário.

2 comentários em “Persistindo Dados no Android com a Room”

  1. Meu caro muito bom o seu artigo, me ajudou bastante a entender o funcionar do Android Room e gostaria de saber se é possível utilizar herança com data class.

    Fiz uma modificação em seu código para tentar incluir herança e fazer com que a classe filho herdasse o atributo name da classe pai, mas não está dando certo. Então fiquei em dúvida, não sei se herança não funciona com data classe ou se eu não estou sabendo passar o valor correto para o construtor (tive de iniciar a variável name como “” porque não entendo o Kotlin direito). Se puder dar uma luz agradeço, pois não encontrei nenhum lugar fazendo isso funcionar. Obrigado.

    Classe filho

    open class CarPai {
    var name: String = “”
    }

    Classe pai
    data class CarFilho (
    @NonNull
    @PrimaryKey(autoGenerate = true)
    var id: Long?
    ) : CarPai() {
    constructor(id: Nothing?, name: String) : this(id)
    }

    Responder
    • Obrigado pelo elogio, Henrique. =)

      Nunca me deparei com a necessidade de herança de data classes em Kotlin nos projetos que desenvolvi até agora. Mas graças a sua dúvida, eu resolvi pesquisar sobre o assunto. Acabei encontrando um questionamento parecido com o seu no StackOverflow, segue o link abaixo:

      https://stackoverflow.com/questions/26444145/extend-data-class-in-kotlin

      De acordo com Andrey Breslav (a pessoa que respondeu a pergunta e participa do projeto da Kotlin), não é recomendado utilizar herança com data classes.

      Espero ter ajudado.

      Responder

Deixe um comentário para Henrique Cancelar resposta