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