🚀 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 antigorawQuery, 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 aListView(ouRecyclerView) se atualize automaticamente sempre que uma nova viagem for inserida, sem necessidade de recarregar a tela manualmente.