Por que nos "Entitys" não está usando o equals e o hashCode?
Por que nos "Entitys" não está usando o equals e o hashCode?
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;
...
}
@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;
...
}
@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"?