🚀 4.1 Definindo Entidades e o Banco de Dados
No Room, não precisamos escrever comandos SQL manuais para criar tabelas. Em vez disso, definimos classes Java anotadas como @Entity, e o framework se encarrega de gerar toda a estrutura do SQLite para nós.
Definindo a Entidade Viagem
Uma entidade representa uma tabela no banco de dados. No Java 17, nossa classe Viagem fica assim:
@Entity(tableName = "viagem")
public class Viagem {
@PrimaryKey(autoGenerate = true)
public Long id;
public String destino;
public Integer tipoViagem;
// Armazenamos a data como Long via TypeConverter (veremos adiante)
public LocalDate dataChegada;
public LocalDate dataSaida;
public Double orcamento;
public Integer quantidadePessoas;
}Criando a Classe do Banco de Dados
A classe do banco de dados deve ser abstrata e herdar de RoomDatabase. Ela centraliza o acesso aos DAOs:
@Database(entities = {Viagem.class, Gasto.class}, version = 1)
@TypeConverters({Converters.class}) // Conversores para LocalDate
public abstract class AppDatabase extends RoomDatabase {
public abstract ViagemDao viagemDao();
public abstract GastoDao gastoDao();
private static volatile AppDatabase INSTANCE;
public static AppDatabase getDatabase(final Context context) {
if (INSTANCE == null) {
synchronized (AppDatabase.class) {
if (INSTANCE == null) {
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
AppDatabase.class, "boa_viagem_db")
.build();
}
}
}
return INSTANCE;
}
}IMPORTANT
Convenção de ID: Ao contrário do antigo
_idexigido peloCursorAdapter, o Room permite utilizar qualquer nome para a chave primária (comoid), pois ele abstrai a comunicação com a interface.
TIP
O uso do padrão Singleton (variável
INSTANCE) garante que tenhamos apenas uma instância do banco de dados aberta durante a execução do app, economizando recursos e evitando conflitos de escrita.