🚀 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.


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