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.