4
respostas

Métodos hashCode e equals.

Por que nos "Entitys" não está usando o equals e o hashCode?

4 respostas

Olá Emerson,

Caso haja equals e hashCode para tratar autenticidade de dado muito processo terá que ser feito, por exemplo:

Você tem uma classe chamada Usuario() com parâmetros nome (String), email (String) e id (int) ao qual vai ser uma @PrimaryKey(autoGenerate = true), imagina criar essa classe Usuario ("Victor", "meu@email.com") e adicionar no Banco de Dados, mas antes disso verificar se esse Usuario já é existente no banco.

Por exemplo:

if(dao.buscaUsuario("meu@email.com") != null){

            Usuario usuarioEncontrado = dao.buscaUsuario("meu@email.com")
            boolean isUsuarioIgual = usuarioEncontrado == Usuario ("Victor", "meu@email.com")

            if(isUsuarioIgual){
                //Não adicionar no banco de dados
            }
        }else{
            //Adiciona no banco de dados
        }

Seria um trabalho a mais tanto para o programador quanto para a o device. Por isso o próprio Room já tem um método próprio para isso. Na classe Usuario() de exemplo só adicionar essa verificação (indices = @Index(value = {"email"}, unique = true)) na Entity

@Entity(indices = @Index(value = {"email"}, unique = true))
public class Usuario {

    @PrimaryKey(autoGenerate = true)
    private int id;
    private String nome;
    private String email;
...
}
  • Eu só gostaria de trazer uma observação, se deseja verificar não só o email mas também o nome antes de adicionar. Neste caso se o email OU o id estiverem no banco de dados, não será possivel adicionar
@Entity(indices = {@Index(value = {"id"}, unique = true),
        @Index(value = {"email"}, unique = true)})
public class Usuario {

    @PrimaryKey(autoGenerate = true)
    private int id;
    private String nome;
    private String email;
...
}
  • E neste caso se o email E o id estiverem no banco de dados , os dois juntos serem iguais não irá adicionar no banco. Caso o id seja o diferente e o email igual irá adicionar.
@Entity(indices = @Index(value = {"id", "email"}, unique = true))
public class Usuario {

    @PrimaryKey(autoGenerate = true)
    private int id;
    private String nome;
    private String email;
...
}

Espero ter ajudado.

Bom dia Victor, muito bom seu esclarecimento.

E no caso de ter uma lista dessa classe "Usuario" e precisar fazer uma busca ou algo assim. Como os métodos irão fazer a comparação de igualdade?

Bom, para fazermos a chamada do DAO temos uma interface UsuarioDAO, correto? Nela que temos métodos com anotações do tipo @Insert @Query @Delete, etc.

Como no exemplo eu tenho usado um @Insert para inserir um único Usuario(), também poderia criar um outro método que iria adicionar uma lista, como parametro para essa @Insert eu adicionaria o onConflict = OnConflictStrategy.IGNORE ao qual iria adicionar todos os usuários que fossem de id e email diferentes, ou, id ou email diferentes (vai depender da regra que tu tem implementado para o parametro da Entity)e irá ignorar aqueles que são iguais, não adicionando-os.

 @Dao
    interface UsuarioDAO {

        @Insert
        void adiciona(Usuario usuario);

        @Insert(onConflict = OnConflictStrategy.IGNORE)
        void adicionarLista(List<Usuario> usuarios);
    }

Bom dia Victor, muito bom seu esclarecimento.

Retornei ao estudos agora.

Mas ainda fico na dúvida. Se tenho uma lista de "Usuario" e quero fazer uma busca usando o método da própria lista o "contains", para isso não será necessário ter o "equals" e "hashCode"?