Imprimir este capítuloImprimir este capítulo

Livro 3 - Projeto Agenda de Contatos - Parte 3

3. Biblioteca Room e persistência de dados

3.2. Classe Contact (Entity)

A agenda de contatos proposta por este aplicativo deve armazenar informações de um contato contendo seu nome, telefone e e-mail. Para a biblioteca Room, cada contato deve representar uma entidade (Entity) e, assim, ser armazenado no banco de dados. Para conseguir fazer a persistência desses dados em um banco precisamos criar uma classe chamada Contato com seus métodos get e construtor pois é assim que a biblioteca entende como instanciar esses objetos.

Observe, no entanto, que apenas a definição clássica de uma classe não é o suficiente para a biblioteca "entender" a classe. Usamos assim um conjunto de anotações (annotations) para escrever essa classe de modo que a biblioteca Room entenda exatamente como queremos que a tabela seja armazenada no banco de dados.

Dessa forma, abra o arquivo Contact.java e implemente o código a seguir:

package ...

import androidx.annotation.NonNull;
import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.Ignore;
import androidx.room.PrimaryKey;

@Entity(tableName = "contacts_table")
public class Contact {

@PrimaryKey(autoGenerate = true)
@NonNull
@ColumnInfo(name = "id")
private int id;

@NonNull
@ColumnInfo(name = "name")
private String name;

@ColumnInfo(name = "phone")
private String phone;

@ColumnInfo(name = "email")
private String email;

public Contact(int id, String name, String phone, String email) {
this.id = id;
this.name = name;
this.phone = phone;
this.email = email;
}

@Ignore
public Contact(String name, String phone, String email) {
this.name = name;
this.phone = phone;
this.email = email;
}

public int getId() {return this.id;}

public String getName(){return this.name;}

public String getPhone() {return this.phone;}

public String getEmail() {return this.email;}
}
  • @Entity(tableName = "contacts_table")
    • Cada classe com a anotação entity representa uma tabela no banco de dados. Por padrão, o próprio nome da classe identifica o nome da tabela mas você pode especificar manualmente como no caso acima.
  • @PrimaryKey
    • Toda entidade precisa de uma chave primária. Para a tabela de contatos será adotado como chave primária o campo id
  • @NonNull
    • Identifica que o parâmetro, campo ou o valor de retorno do método nunca seja nulo
  • @ColumnInfo(name = "phone")
    • Especifica o nome da coluna na tabela. Por padrão, se adota o próprio nome do campo mas você pode definir manualmente.
  • Observe também que todos os campos devem possuir um método get e deve existir ao menos um construtor padrão com todos os campos para se poder instanciar os objetos. Nesta classe declaramos um construtor padrão e outro com a omissão do campo id. O construtor padrão vai ser invocado quando usarmos comandos como "select *", ou seja, queremos retornar uma lista de contatos do banco de dados. E o outro será usado quando formos adicionar um novo contato, pois ao omitir o campo id a biblioteca Room entende e fica automaticamente carregada de criar um valor id válido. Ademais, para a biblioteca Room entender qual é o construtor padrão devemos usar a anotação @Ignore nos demais construtores.

Você pode encontrar a lista completa de anotações nesta documentação.