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

Não consigo converter o Id (long) em String com o método toString dentro do método deleta

O compilador acusa erro na linha String[] params = {aluno.getId().toString()}; do método

    public void deleta(Aluno aluno) {
        SQLiteDatabase db = getWritableDatabase();

        String[] params = {aluno.getId().toString()};
        db.delete("Alunos", "id = ?", params);
    }

com a mensagem: "error: long cannot be dereferenced".

Ao botar o cursor sobre o método toString() o Android Studio diz "cannot resolve method"

Segue também a classe Aluno caso haja algum problema com ela (até a criação do método deleta o código funcionou perfeitamente).

public class Aluno {
    private Long id;
    private String nome;
    private String endereco;
    private String telefone;
    private String site;
    private Double nota;

    public long getId() {
        return id;
    }

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

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getEndereco() {
        return endereco;
    }

    public void setEndereco(String endereco) {
        this.endereco = endereco;
    }

    public String getTelefone() {
        return telefone;
    }

    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }

    public String getSite() {
        return site;
    }

    public void setSite(String site) {
        this.site = site;
    }

    public double getNota() {
        return nota;
    }

    public void setNota(double nota) {
        this.nota = nota;
    }

    @Override
    public String toString() {
        return getId() + " - " + getNome();
    }
}
8 respostas

Oi.

Tenta pegar o ID como string dessa forma:

String alunoID = String.valueOf(aluno.getId());
solução!

Oi Natan, tudo bem ?

Cara seu erro é bem interessante, vamos lá.

Temos os primitivos, que já tem seu valor default, o long por exemplo é 0.

E também temos as classes wrapper, que são classes auxiliares que gerenciam o primitivo dentro delas basicamente.

No seu modelo você criou o atributo utilizando a classe wrapper, já no seu getter e setter você está utilizando o primitivo, que por sua vez não tem métodos.

Para você resolver seu problema você tem duas saídas :

  • alterar o getter para wrapper, para poder ter acesso a classe e seus métodos

  • manter o getter, e no seu Dao usar a classe String para fazer a conversão, String.valueOf()

Troca ai e fala para gente se deu certo !

Abraços :D

Obrigado Bruno e Matheus! O código compilou utilizando o valueOf, porém não entendi como transformar o meu getter em um wraper, já que o getter apenas retorna o campo id que já está declarado como wrapper.

Fala Natan.

Seguinte...

A primeira dica do Matheus seria alterar o seu retorno do getter para usar a classe de wrapper. Você declarou na classe Aluno o id como Long (classe wrapper), porém no getter você retorna ele como long(primitivo). No caso, a ideia seria você alterar o retorno do getter de long para Long, aí estaria utilizando a classe wrapper e poderia receber o valor do getter em uma variável Long. A vantagem disso é que com uma variável Long você poderia fazer coisas como isso, por exemplo:

String alunoID = Long.toString(variavelLong);

A segunda dica do Matheus seria alterar o retorno do getter para String e no return, ao invés de retornar só o id, já retornar String através do valueOf():

public String getId() {
        return String.valueOf(id);
    }

Entendi Bruno!

Irei trabalhar com a conversão de Long para String utilizando o valueOf na classe AlunoDAO para que o meu getId não me retorne uma String toda vez que eu invocá-lo em outra classe.

Obrigado!

Natan, você pode fazer o seguinte :

  • No seu dao :
long id = aluno.getId();
String idTexto = String.valueOf(id);
  • Na sua classe Aluno seguido do Dao:
public Long getId(){
    return this.id;
}

Agora no Dao :

String id = aluno.getId().toString();

Abraços

Faz total sentido, você pode querer o retorno como long mesmo...

é só usar a classe Long pra id ao invés do primitivo long, pq nessa parte ainda da pra usar o "Valueof" pra converter, mas na hora de comparar o id com o null mais pra frente não rola.