🚀 4.2 Gravação das viagens com DAO
No Room, as operações de acesso a dados são concentradas em interfaces anotadas como @Dao (Data Access Object). Isso elimina a necessidade de manipular ContentValues manualmente e torna o código muito mais legível.
Definindo o DAO de Viagens
Criamos uma interface que descreve as ações possíveis. O Room gerará a implementação automaticamente para nós em tempo de compilação:
@Dao
public interface ViagemDao {
@Insert
void inserir(Viagem viagem);
@Delete
void remover(Viagem viagem);
@Query("SELECT * FROM viagem")
List<Viagem> listarTodos();
}Salvando Dados na Activity (Modern Java 17)
Ao salvar uma viagem, instanciamos a Entity, preenchemos seus dados e invocamos o DAO. Como o Room proíbe operacões no banco na Thread Principal (para evitar travamentos), utilizamos um executor simples:
public void salvarViagem(View view) {
// 1. Criar novo objeto da Entidade
var novaViagem = new Viagem();
novaViagem.destino = binding.editDestino.getText().toString();
novaViagem.orcamento = Double.parseDouble(binding.editOrcamento.getText().toString());
// 2. Executar em background (Thread Secundária)
Executors.newSingleThreadExecutor().execute(() -> {
var db = AppDatabase.getDatabase(this);
db.viagemDao().inserir(novaViagem);
// 3. Notificar o usuário na Main Thread
runOnUiThread(() -> {
Toast.makeText(this, "Viagem salva com sucesso!", Toast.LENGTH_SHORT).show();
finish();
});
});
}CAUTION
Thread Safety: Nunca execute operações de leitura ou escrita no banco de dados na Main Thread. O Android lançará uma exceção e encerrará o aplicativo se detectar operações de IO pesadas na thread da interface.
TIP
O uso de
@Inserté flexível: você pode passar um único objeto, uma lista (List<Viagem>) ou até mesmo múltiplos objetos como parâmetros variáveis.