🚀 4.4 Atualização de Dados com Room

A atualização de registros no Room é extremamente intuitiva. Em vez de lidar com cláusulas WHERE manuais em strings SQL, utilizamos a anotação @Update, que identifica o registro a ser alterado através da sua chave primária (@PrimaryKey).

Definindo a Operação no DAO

Adicionamos o método de atualização ao nosso ViagemDao. O Room cuidará de encontrar a viagem correta pelo id:

@Dao
public interface ViagemDao {
    @Update
    void atualizar(Viagem viagem);
 
    @Query("SELECT * FROM viagem WHERE id = :id")
    Viagem buscarPorId(Long id);
    
// Dica: 'OnConflictStrategy.REPLACE' funciona como um "Save or Update"
@Insert(onConflict = OnConflictStrategy.REPLACE)
void salvarOuAtualizar(Viagem viagem);

}

## Refatorando a ViagemActivity (Java 17)
 

Quando o usuário seleciona “Editar”, passamos o id da viagem via Intent. Na ViagemActivity, se o id estiver presente, carregamos os dados do banco para preencher o formulário:

// No onCreate da ViagemActivity.java
var id = getIntent().getLongExtra(Constantes.VIAGEM_ID, -1L);
 
if (id != -1L) {
    Executors.newSingleThreadExecutor().execute(() -> {
        var dao = AppDatabase.getDatabase(this).viagemDao();
        var viagem = dao.buscarPorId(id);
        
        runOnUiThread(() -> preencherFormulario(viagem));
    });
}

Lógica de Salvamento Unificada

O método salvarViagem agora decide se deve inserir ou atualizar com base na existência do objeto ou do ID:

public void salvarViagem(View view) {
    var viagem = (this.viagemExistente != null) ? this.viagemExistente : new Viagem();
    
    viagem.destino = binding.editDestino.getText().toString();
    viagem.orcamento = Double.parseDouble(binding.editOrcamento.getText().toString());
 
    Executors.newSingleThreadExecutor().execute(() -> {
        var dao = AppDatabase.getDatabase(this).viagemDao();
        
    // Uso de @Insert com OnConflictStrategy.REPLACE simplifica essa lógica
    dao.salvarOuAtualizar(viagem);
    
    runOnUiThread(() -> {
        Toast.makeText(this, R.string.registro_salvo, Toast.LENGTH_SHORT).show();
        finish();
    });
});

}

> [!IMPORTANT]
> 
> **Segurança de Tipos:**
> Ao utilizar o Room, você elimina erros de conversão de tipos (ex: tentar salvar uma String em uma coluna Double) que só seriam detectados em tempo de execução no SQLite tradicional.
 
> [!TIP]
> 
> Para uma melhor experiência do usuário, utilize o método `apply()` em vez de `commit()` ao trabalhar com preferências, e sempre execute operações de banco de dados fora da Thread de UI.

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