🚀 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 AppDatabase como um Singleton. Abrir múltiplas conexões com o arquivo do banco consome CPU excessiva e pode corromper os dados em escritas simultâneas.


⬅️ Capítulo Anterior | Próximo Capítulo ➡️