web-dev-qa-db-de.com

Prüfen, ob ein bestimmter Wert in der Firebase-Datenbank vorhanden ist

Ich mache eine Android-Anwendung mit Firebase Echtzeitdatenbank. Wenn sich ein neuer Benutzer in meiner App registriert, werden die Daten dieses Benutzers in der Firebase-Datenbank gespeichert. 

Ein Benutzer muss die folgenden Informationen angeben, um sich zu registrieren:

  1. Vollständiger Name
  2. Email 
  3. Username
  4. Passwort

Datenbankstruktur

 enter image description here

Immer wenn ein neuer Benutzer versucht, sich zu registrieren, muss ich sicherstellen, dass der Benutzername jedes Benutzers eindeutig ist. Ich überprüfe die Datenbank, ob die vom Benutzer eingegebene username bereits in der Datenbank vorhanden ist oder nicht.

Dafür schrieb ich die folgende Methode:

private boolean usernameExists(String username) {
     DatabaseReference fdbRefer = FirebaseDatabase.getInstance().getReference("Users/"+username);
     return (fdbRefer != null);
}

Meine Logik hinter dieser Methode ist, dass, wenn die getReference-Methode keinen Verweis auf den angegebenen Pfad findet, der Wert null zurückgegeben wird, sodass ich zurückgeben kann, ob fdbRefernull ist oder nicht. Wenn fdbRefernull ist, bedeutet dies, dass username nicht in der Datenbank vorhanden ist.

Problem

Das Problem bei dieser Methode ist, dass immer true zurückgegeben wird, ob die eingegebene username in der Datenbank vorhanden ist oder nicht. Das hat mich dazu gebracht zu glauben, dass fdbRefer niemals null ist. 

Das bringt mich zu meiner Frage ... 

Frage

Was gibt die getReference-Methode zurück, wenn der angegebene Pfad in der firebase-Datenbank nicht gefunden wird, und wie können Sie überprüfen, ob die username bereits in der Datenbank vorhanden ist oder nicht?

6
Nick

Um zu überprüfen, ob ein Benutzer existiert, verwenden Sie bitte den folgenden Code:

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) {
        Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
    }
};
userNameRef.addListenerForSingleValueEvent(eventListener);

Sie können auch eine Abfrage verwenden, um dasselbe zu erreichen:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
Query query = rootRef.child("Users").orderByChild("userName").equalTo("Nick123");
query.addValueEventListener(/* ... */);

Dies ist ein weiterer Ansatz, der den gesamten Users-Knoten durchläuft, aber nicht nur eine direkte Referenz auf einen einzelnen Benutzer verwendet. Diese Option wird eher verwendet, wenn Sie als eindeutige ID zwischen Benutzern die uid anstelle des Benutzernamens verwenden (wie Sie es gerade tun). Wenn Ihre Datenbankstruktur also etwa so aussieht:

Firebase-root
   |
   --- Users
        |
        --- uid
             |
             --- userName: "Test User"
             |
             --- emailAddress: "[email protected]"

Die zweite Lösung ist die empfohlene.

Es gibt auch eine andere Lösung, bei der Sie einen weiteren Knoten mit dem Namen userNames erstellen, in dem Sie nur die eindeutigen Benutzernamen speichern können. Hier finden Sie auch die entsprechenden Sicherheitsregeln:

"Users": {
  "$uid": {
    ".write": "auth !== null && auth.uid === $uid",
    ".read": "auth !== null && auth.provider === 'password'",
    "userName": {
      ".validate": "
        !root.child('userNames').child(newData.val()).exists() ||
        root.child('userNames').child(newData.val()).val() == $uid"
    }
  }
}

Da in diesem Fall Ihr Benutzername jedoch bereits der Name des Knotens ist, empfehle ich Ihnen, den ersten zu verwenden.

17
Alex Mamo

Versuche dies:

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
          }
        }

Sie müssen orderbychild und equalto verwenden, um den Wert zu überprüfen, wenn er vorhanden ist ..__ Wenn Sie orderbychild und equalto nicht verwenden, wird nur geprüft, ob der username-Kinderknoten vorhanden ist und sich nicht um den Wert kümmert.

diese orderByChild("username").equalTo(Nick123) sagt aus:

WHERE username=Nick123
2
Peter Haddad

Überprüfen Sie es so ...

    fdbRefer.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.exist() {
//username exist
}
else {
//username doesn't exist
}
}
});
2
Amit Joshi

Funktioniert perfekt für mich

DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
        Query query = reference
                .child(getString(R.string.dbname_users))
                .orderByChild("username")
                .equalTo(username);
        query.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if(dataSnapshot.getChildrenCount()>0) {
                    //username found

                }else{
                    // username not found
                }

            }
            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

Anstatt zu prüfen, ob die Referenz vorhanden ist, können Sie mit der Abfrage orderBy prüfen, ob bereits ein Benutzername vorhanden ist

orderByChild ('Benutzername'). Die Abfrage "equalTo (Benutzername)" würde Daten zurückgeben, wenn bereits Daten vorhanden sind. Andernfalls wird Null zurückgegeben.

1
sivaram636

Da Sie bereits eine Lösung für Ihr Problem gefunden haben, werde ich versuchen zu erklären, warum Ihr Code nicht funktioniert hat.

 DatabaseReference fdbRefer = FirebaseDatabase.getInstance().getReference("Users/"+username);

Möglicherweise denken Sie, dass in der obigen Anweisung fdbRefer null sein wird, wenn "Benutzer /" + Benutzername nicht in der Datenbank vorhanden ist.
Diese Anweisung speichert jedoch nur einen Pfad zu dem angegebenen Feld in getReference(). Wenn Sie also nach fdbRef!=null suchen, ist dies immer wahr, da fdbRefer etwas wie 'https: //.firebase.com/Users/Nick123' enthält.

0
vivek kumar