Verificando si existe un valor particular en la base de datos de firebase

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 

Estructura de la base

enter image description here

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.

Problema

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 …

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.