🚀 4.6 Padrões de Arquitetura e Boas Práticas
Com o Room, subimos o nível da nossa engenharia. Não estamos apenas salvando dados; estamos construindo uma infraestrutura resiliente e escalável. Nesta seção, consolidaremos os padrões que transformam um app comum em um produto de Engenharia Premium.
1. O Padrão Repository
O Repository atua como um mediador entre diferentes fontes de dados (Banco de Dados Local, API Remota, Cache). Ele isola a lógica de negócio do Room, facilitando testes e futuras trocas de tecnologia.
public class ViagemRepository {
private final ViagemDao dao;
public ViagemRepository(Context context) {
db = AppDatabase.getDatabase(context);
dao = db.viagemDao();
}
public List<Viagem> carregarViagens() {
// Lógica de decisão: buscar no cache ou no banco
return dao.listarTodas();
}
}2. Conversores de Tipo (TypeConverters)
O SQLite nativamente não conhece o tipo LocalDate do Java 17. Para resolver isso sem poluir nossas entidades, utilizamos um TypeConverter:
public class Converters {
private static final DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE;
@TypeConverter
public static LocalDate fromTimestamp(String value) {
return value == null ? null : LocalDate.parse(value, formatter);
}
@TypeConverter
public static String dateToTimestamp(LocalDate date) {
return date == null ? null : date.format(formatter);
}
}3. Reatividade com LiveData
Embora estejamos usando a API de Views (XML), o Room permite retornar LiveData. Isso elimina a necessidade de chamar notifyDataSetChanged() manualmente, pois a UI “observa” o banco:
// No DAO
@Query("SELECT * FROM viagem")
LiveData<List<Viagem>> listarTodasLiveData();
// Na Activity
repository.getViagens().observe(this, viagens -> {// Atualiza o adapter automaticamente sempre que o banco mudar!
atualizarInterface(viagens);
});
> [!IMPORTANT]
>
> **Abstração Total:**Utilizando Room e Repositories, sua Activity nunca saberá que existe um banco de dados SQLite por baixo. Ela apenas solicita dados e reage a eles.
TIP
Singleton de Banco de Dados: Mantenha a instância do
AppDatabasecomo um Singleton. Abrir múltiplas conexões com o arquivo do banco consome CPU excessiva e pode corromper os dados em escritas simultâneas.