🚀 4.3 Listagem Dinâmica com Room

Uma das maiores vantagens do Room é a eliminação do tratamento manual de Cursors. O framework mapeia automaticamente os resultados do banco de dados para objetos Java, garantindo segurança de tipos e código muito mais limpo.

Consultas Simples e Agregadas no DAO

No seu ViagemDao, definimos as consultas necessárias para alimentar a listagem e calcular o total de gastos:

@Dao
public interface ViagemDao {
    @Query("SELECT * FROM viagem")
    List<Viagem> listarTodas();
 
    @Query("SELECT SUM(valor) FROM gasto WHERE viagem_id = :viagemId")
    Double calcularTotalGasto(Long viagemId);
}

Atualizando a ViagemListActivity (Java 17 & ViewBinding)

Agora, em vez de iterar manualmente sobre um Cursor, simplesmente solicitamos a lista de objetos ao DAO. Note como o código se torna focado na lógica de negócio:

private void carregarViagens() {
    // Execução em Thread Secundária (Obrigatório no Room)
    Executors.newSingleThreadExecutor().execute(() -> {
        var dao = AppDatabase.getDatabase(this).viagemDao();
        var viagensDb = dao.listarTodas();
        
        var listaFinal = new ArrayList<Map<String, Object>>();
 
        for (var viagem : viagensDb) {
            var item = new HashMap<String, Object>();
            item.put("destino", viagem.destino);
            item.put("imagem", (viagem.tipoViagem == LAZER) ? R.drawable.lazer : R.drawable.negocios);
            
            // Cálculo agregado direto do banco
            var total = dao.calcularTotalGasto(viagem.id);
            item.put("total", "Gasto total R$ " + (total != null ? total : 0.0));
            
            listaFinal.add(item);
        }
 
        // Atualização da UI na Thread Principal
        runOnUiThread(() -> {
            var adapter = new SimpleAdapter(this, listaFinal, R.layout.lista_viagem, de, para);
            binding.listViewViagens.setAdapter(adapter);
        });
    });
}

IMPORTANT

Segurança de Consultas: Com o Room, se você cometer um erro de digitação no nome de uma coluna dentro da anotação @Query, o Android Studio reportará o erro durante a compilação. Com o antigo rawQuery, esse erro só apareceria quando o usuário tentasse abrir a tela, causando um crash.

TIP

Para aplicações em tempo real, considere retornar LiveData<List<Viagem>> no DAO. Isso fará com que a ListView (ou RecyclerView) se atualize automaticamente sempre que uma nova viagem for inserida, sem necessidade de recarregar a tela manualmente.


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