Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Room - @Update não está funcionando.

Galera, o meu update não está funcionando.

Não é apresentado nenhum erro, o programa roda normalmente, no adapter o objeto é modificado como se espera. O único problema está no Update que não atualiza o objeto no banco de dados.

Alguém tem alguma dica do que possa estar acontecendo?

No DaoRoom o código está assim:

@Update
    void altera(Nota nota);

E a minha classe é essa:

@Entity
public class Nota implements Serializable {

    private String titulo;
    private String descricao;

    @PrimaryKey(autoGenerate = true)
    private int id;

    public Nota(String titulo, String descricao) {
        this.titulo = titulo;
        this.descricao = descricao;
    }

    public String getTitulo() {
        return titulo;
    }

    public String getDescricao() {
        return descricao;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

Tentei usar algum método diferente como o onConflictStrategy.Replace junto ao @Insert, mas ele não atualiza. Na verdade ele atualiza uma nova nota. Suspeito que seja problema com o id, mas não consigo identificar como resolver. Pra via de contexto estou usando o recyclerView, que atualiza o adapter normalmente, mas não atualiza o banco de dados

4 respostas

Fala Victor, de boa ?

Cara consegue mostrar pra gente onde está o erro ? Porque em tese não tem nada de errado nesse esquema ai que tu fez

Então, é justamente esse o problema Kkkkkk.

Seguinte, o fluxo de edição deveria ser:

  1. Clique na view que contém as informações a serem editadas.
  2. Edição das informações
  3. Atualização do adapter
  4. Atualização das informações no banco de dados

Até o passo 3 tudo acontece tranquilamente. E realmente as informações do adapter atualizam, mas quando eu fecho e abro o aplicativo as informações antigas voltam. Como se não tivessem sido modificadas no banco de dados.

Ex: Tem uma view salva com Título: "Título 1" e Descrição: "Descrição 1 " Eu edito e coloco "Título 2" e "Descrição 2"

No momento que salva, as informações são alteradas no adapter

Ao fechar o app e abrir novamente, a view retorna com "Título 1" e "Descrição 1"

Eis aqui o link do projeto no gitHub, caso queira https://github.com/Euvickson/ListaDeNotas

solução!

Olhei seu código e vi que você está jogando o id da nota para edição fora, pois você sempre cria uma nova instância e é por esse motivo que a mudança não é refletida no banco.

Pra quem também tiver dúvida, caso seja cego que nem eu Kkkkkkkk, essa era a parte do código que estava com problemas:

Esse era o formulário para inserir a nota, o problema é que eu sempre criava uma nova nota e por isso não era salvo no banco de dados.

//Esse método é o reponsável por identificar se algum menu foi tocado. Só é preciso identificar qual o menu foi clicado.
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        if (verificaMenuTocado(item)) {
            Nota notaCriada = new Nota(titulo.getText().toString(), descricao.getText().toString());
            retornaNotaParaOnActivityResult(notaCriada);
            finish();
        }
        return super.onOptionsItemSelected(item);
    }

Para corrigir é só fazer uma verificação e tomar atitudes diferentes para cada situação. Se for a criação de uma nota nova, criar uma nota, se a activity tiver recebido uma nota, então é para fazer o processo de alteração dos dados daquela nota

@Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        if (verificaMenuTocado(item)) {
            if(notaRecebida != null){
                editaTituloEDescricao();
                retornaNotaParaOnActivityResult(notaRecebida);
            } else{
                Nota notaCriada = criaNota();
                retornaNotaParaOnActivityResult(notaCriada);
            }
            finish();
        }
        return super.onOptionsItemSelected(item);
    }

Matheus, obrigado por ter tirado seu tempo pra me ajudar