Estoy haciendo una aplicación para Android usando la base de datos de Firebase
. Cuando un nuevo usuario se registra en mi aplicación, los datos de ese usuario se guardan en la base de datos de firebase.
El usuario debe proporcionar los siguientes detalles para registrarse
1. Full Name 2. Email 3. Username 4. Password
Cada vez que un nuevo usuario intenta registrarse, debo asegurarme de que el nombre de usuario de cada usuario sea único, así que debo verificar la base de datos si el username
ingresado por el usuario ya existe en la base de datos o no.
Para hacer esto, escribí el siguiente método
private boolean usernameExists(String username) { DatabaseReference fdbRefer = FirebaseDatabase.getInstance().getReference("Users/"+username); return (fdbRefer != null); }
Mi lógica detrás de este método es que si el método getReference
no puede encontrar una referencia a la ruta especificada, devolverá nulo, entonces puedo devolver si fdbRefer
es null
o no. Si fdbRefer
es null
, significa que el username
no existe en la base de datos.
El problema con este método es que siempre devuelve true
si el username
ingresado existe en la base de datos o no. Lo que me llevó a creer que fdbRefer
nunca es null
.
Esto me lleva a mi pregunta …
¿Qué getReference
método getReference
cuando no puede encontrar la ruta especificada en la firebase
datos de firebase
y cuál es la forma correcta de verificar si el username
ya existe en la base de datos o no?
Para verificar la existencia de un usuario, utilice el siguiente código:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference(); DatabaseReference userNameRef = rootRef.child("Users").child("Nick123"); ValueEventListener eventListener = new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { if(!dataSnapshot.exists()) { //create new user } } @Override public void onCancelled(DatabaseError databaseError) {} }; userNameRef.addListenerForSingleValueEvent(eventListener);
También puede usar una consulta para lograr lo mismo así:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference(); Query query = rootRef.child("Users").orderByChild("username").equalTo("Nick123"); query.addValueEventListener(/* ... */);
Este es otro enfoque, pero te recomiendo que uses el primero, porque no estás recorriendo todo el nodo de Users
, solo verificas los existentes de un solo usuario. Y también, dado que su nombre de usuario ya es el nombre del nodo, la primera solución es la mejor.
Compruébalo así …
fdbRefer.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { if(dataSnapshot.exist() { //username exist } else { //username doesn't exist } } });
Prueba esto:
DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("Users"); ref.orderByChild("username").equalTo(Nick123).addValueEventListener(new ValueEventListener(){ @Override public void onDataChange(DataSnapshot dataSnapshot){ if(dataSnapshot.exist() { //username exist } }
Tienes que usar orderbychild
e equalto
para verificar el valor si está allí. Si no usa orderbychild
e equalto
entonces solo comprobará si el nodo hijo de username
está allí y no se preocupa por el valor.
este orderByChild("username").equalTo(Nick123)
es como decir:
WHERE username=Nick123
En lugar de verificar la existencia de la referencia, puede usar orderBy query para verificar si el nombre de usuario ya existe
La consulta orderByChild (‘username’). equalTo (username) devolverá los datos si ya existen algunos datos, sino que devolverá null.