Por que nos "Entitys" não está usando o equals e o hashCode?
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
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"?