2017-02-06 2 views
1

Normalerweise, wenn ich überprüfen, ob die Datenbank einen Knoten enthält ich so etwas wie:Firebase vorhanden ist() vs null

users = dbReference.getReference("users").child(someUser); 

ich nicht hasChild() verwenden, weil ich auf einem großen Daten-Set weiß, das irgendwann in Anspruch nehmen kann Abfrage. Vor kurzem stieß ich jedoch auf die Methode exists()found here on documentation Jetzt fragte ich mich nur, wie unterscheidet sich das von mir nur überprüft, ob der Schnappschuss Null ist? Und wie funktioniert die exists() Funktion? Wie hasChild() iteriert über den Datensatz was macht esists()?

Und ist es besser als die Überprüfung auf Null? ist die Dokumentation nicht viel sagen

dank

UPDATE 1

Angenommen, ich habe den folgenden Knoten:

example node

Wenn ein Benutzer anmelden möchte ich diesen Knoten überprüfen Überprüfen Sie, ob der Benutzername vergeben wurde:

userTakenNode.addListenerForSingleValueEvent(new ValueEventListener() { 


     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 

      if (!dataSnapshot.hasChild(enteredUsername)) { 
       register(); 
      } 

     } 

Wenn der Benutzername nicht vergeben ist, registriere ich den Benutzer mit diesem Benutzernamen und füge den Benutzernamen dem obigen Knoten hinzu. Jetzt benutze ich hasChild() zu meinem Verständnis, obwohl dies über den ganzen Knoten iterieren wird, bis es es findet und zurückgeben wird, sonst wird nichts zurückgeben. Bei einem großen Datensatz kann dies sehr lange dauern.

Gibt es eine schnellere Möglichkeit, den Datensatz abzufragen?

+1

Der Code, den Sie Sätze geteilt in der Datenbank einen Verweis auf eine Position nach oben. Es prüft nicht, ob ein Knoten existiert. –

+0

@FrankvanPuffelen Hallo, ich verstehe den Code oben, den ich geteilt habe, ist ein Verweis auf eine Datenbank. Ich habe gerade gezeigt, wie ich normalerweise zu einem Kindknoten innerhalb der Datenbank kommen würde, meine Frage ist. Unter der Annahme, dass der obige Datenbankverweis null ist (also nicht in der Datenbank existiert), verwende ich normalerweise eine if-Anweisung, um dies zu testen, und teste, ob dataSnapshot == null ist. Wie unterscheidet sich die Funktion 'exists()' von der Verwendung von null zum Überprüfen und welche ist besser zu verwenden? Danke – memoryManagers

+0

Die Datenbankreferenz, die Sie freigegeben haben, wird * nie * null sein. Bitte aktualisieren Sie Ihre Frage so, dass sie den minimalen, vollständigen Code enthält, nach dem Sie fragen. Es wird viel einfacher sein, damit zu helfen. –

Antwort

0

Sie möchten nur den spezifischen Benutzernamen überprüfen. So legen Sie Ihren Hörer eine Ebene tiefer in den Baum:

userTakenNode.child(enteredUsername).addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     if (!dataSnapshot.exists) { 
      register(); 
     } 
    } 

Aber im Allgemeinen dieses Szenario ist besser geeignet für eine transaction, die den aktuellen Wert des Knotens kombiniert bekommen und den neuen Wert in einem einzigen Vorgang zu setzen.

+0

das ist, was ich versuchte zu fragen, danke – memoryManagers

1

existiert, ist etwas effizienter:

Gibt true zurück, wenn diese DataSnapshot keine Daten enthält. Es ist etwas effizienter als die Verwendung von snapshot.val()! == null.

Firebase exists documentation