Vérifier si une valeur existe dans le Firebase base de données
Je fais une application Android à l'aide de Firebase
en temps réel de la base de données. Lorsqu'un nouvel utilisateur s'inscrit sur mon application, que les données de l'utilisateur est enregistré dans la Firebase base de données.
Un utilisateur doit fournir les informations suivantes pour vous inscrire:
- Nom Complet
- Nom d'utilisateur
- Mot de passe
Structure De Base De Données
Chaque fois qu'un nouvel utilisateur tente d'inscrire, je dois veiller à ce que chaque nom d'utilisateur est unique, j'ai donc vérifier la base de données si le username
entré par l'utilisateur existe déjà dans la base de données ou non.
Pour ce faire, j'ai écrit la méthode suivante:
private boolean usernameExists(String username) {
DatabaseReference fdbRefer = FirebaseDatabase.getInstance().getReference("Users/"+username);
return (fdbRefer != null);
}
Ma logique derrière cette méthode est que si getReference
méthode ne peut pas trouver de référence pour le chemin d'accès spécifié, il sera de retour null, afin que je puisse retourner si fdbRefer
est null
ou pas. Si fdbRefer
est null
, alors cela signifie que username
n'existe pas dans la base de données.
Problème
Problème avec cette méthode est qu'elle renvoie toujours true
si l'entrée username
existe dans la base de données ou non. Ce qui m'a amené à croire que fdbRefer
n'est jamais null
.
Ce qui m'amène à ma question...
Question
Ce n' getReference
de retour de méthode quand il ne peut pas trouver le chemin d'accès spécifié dans le firebase
base de données et quelle est la bonne façon de vérifier si le username
existe déjà dans la base de données ou pas?
Vous devez vous connecter pour publier un commentaire.
Pour vérifier l'existence de l'utilisateur, veuillez utiliser le code ci-dessous:
Vous pouvez également utiliser une Requête pour obtenir la même chose comme ceci:
C'est une autre approche qui est en parcourant l'ensemble de la
Users
nœud, mais n'est pas simplement en utilisant une référence directe à un seul utilisateur. Cette option est plus susceptible d'être utilisé lorsque vous utilisez un identificateur unique beteeen les utilisateurs de lauid
au lieu du nom d'utilisateur (comme vous le faites en ce moment). Donc, si votre base de données de la structure ressemble à ceci:La deuxième solution est celle qui est recommandée.
Il y a aussi une autre solution qui consiste à youto créer un autre nœud nommé
userNames
, dans laquelle vous pouvez détiennent seulement des noms d'utilisateur unique. Veuillez également trouver ci-dessous le correspondant règles de sécurité:Mais étant donné que dans ce cas, votre nom d'utilisateur est déjà le nom du nœud, je vous recommande d'aller de l'avant avec la première.
if(!dataSnapshot.exists())
est-ce ?dataSnapshot
objet représente un instantané à l'emplacement suivant:Firebase-root -> Users -> Nick123
. La meilleure solution est d'utiliserexists()
méthode directement sur ladataSnapshot
pour vérifier existens. Lorsque vous utilisez une Requête, vous êtes en boucle à travers l'ensemble de l'objet, ce qui signifie gaspillage de bande passante. Je vous ai donné aussi à la Requête de la solution, peut-être que vous aurez besoin à l'avenir..child("Nick123")
dans cette:.child(pushedId)
. Mais pour stocker les détails de l'utilisateur sous une poussée id n'est pas une très bonne pratique. Vous devez utiliser leuid
comme ceci: String uid = FirebaseAuth.getInstance().getCurrentUser().getUid(); etrootRef.child("Users").child(uid)
, droit?Vérifier comme ça...
Essayez ceci:
Vous devez utiliser
orderbychild
etequalto
pour vérifier la valeur si elle est là.Si vous ne faites pas de l'
orderbychild
etequalto
alors il va juste vérifier siusername
nœud enfant est là et ne s'inquiète pas au sujet de la valeur.ce
orderByChild("username").equalTo(Nick123)
est comme de dire:Au lieu de vérifier la existe de référence vous pouvez utiliser orderBy requête pour vérifier si le nom d'utilisateur existe déjà
orderByChild('username').equalTo(nom d'utilisateur) de la requête renvoie des données si des données existe déjà, sinon elle renvoie null.
Puisque vous avez déjà trouvé une solution à votre problème, je vais essayer d'expliquer pourquoi ton code ne fonctionnait pas.
Vous pensez peut-être que, dans la déclaration ci-dessus
fdbRefer
sera nulle si les "Utilisateurs/"+nom d'utilisateur n'est pas présent dans la base de données.Mais en fait, cette déclaration ne fait que conserver un chemin d'accès pour le champ spécifié dans
getReference()
. Ainsi, lorsque vous recherchez desfdbRef!=null
, c'est toujours vrai, carfdbRefer
tiendra valeur comme quelque chose de " https://.firebase.com/Users/Nick123.