2016-05-21 29 views
0

So habe ich meine Backend mit Firebase. Was ich erreichen möchte, ist das Hinzufügen von Benutzerübereinstimmungen zu einer Benutzer-ID. Wenn sich der Benutzer jedoch zunächst anmeldet, sind keine Übereinstimmungen vorhanden. Ich versuche zu überprüfen, ob das "match" -Kind in einem Benutzerkind vorhanden ist oder nicht, wenn kein list-Kind erstellt wird und die erste Übereinstimmung gespeichert wird. Wenn es jedoch bereits vorhanden ist, wird die Übereinstimmung einfach hinzugefügt. Hier ist mein Code:Firebase überprüfen, ob Kind existiert

public void setMatch(final String match){ 
    final Firebase ref = new Firebase("FIREBASEURL"); 
    final Firebase userRef = ref.child("Flights").child(userName); 
    userRef.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      System.out.println("does the child exist? " + dataSnapshot.child("matches").exists()); 
      if(!dataSnapshot.child("matches").exists()){ 
       ArrayList<String> matches = new ArrayList<String>(); 
       matches.add(match); 
       Firebase matchesRef = userRef.child("matches"); 
       matchesRef.setValue(matches); 
       userRef.removeEventListener(this); 
      }else if(dataSnapshot.child("matches").exists()){ 
       Map<String, Object> matches = new HashMap<>(); 
       matches.put("matches", match); 
       userRef.child("matches").push().setValue(matches); 
       userRef.removeEventListener(this); 
      } 
     } 

     @Override 
     public void onCancelled(FirebaseError firebaseError) { 

     } 
    }); 
} 

Derzeit wird der Wert zweimal hinzugefügt wird (die sonst, wenn zweimal aufgerufen wird, wenn das Feld bereits/seinen Namen existiert, wenn dies nicht der Fall). Ich bin mir nicht sicher, was ich falsch mache.

Antwort

1

Das klingt ziemlich kompliziert. In der Firebase-Datenbank ist es oft am besten, Lese- und Schreibvorgänge so weit wie möglich zu trennen. Und während Push-IDs sind eine gute Möglichkeit, Daten in einer chronologischen Art und Weise zu speichern; Wenn Elemente einen natürlichen Schlüssel haben, ist es oft besser, sie unter diesem Schlüssel zu speichern. Wenn Ihre String match wirklich eine String matchId ist, können Sie sicherstellen, dass jede Übereinstimmung höchstens einmal vorhanden ist, indem Sie matchId als Schlüssel verwenden.

userRef.child("matches").child(matchId).setValue(true); 

Dieser Vorgang ist Idempotent: Es wird das gleiche Ergebnis egal geben, wie oft Sie es laufen.

Sie werden feststellen, dass ich nicht überprüfen, matches bereits vorhanden ist: die Firebase-Datenbank erstellt automatisch alle Knoten, die zum Speichern des Werts benötigt werden und es automatisch alle Knoten entfernt, die keine Werte unter ihnen haben.

1

Es sieht so aus, als ob Sie das Feld erstellen, wenn es nicht im if-Block vorhanden ist, und dann testen, ob dieses Feld (das gerade erstellt wurde) vorhanden ist, und es jetzt erneut hinzufügt. Der removeEventListener-Aufruf entfernt den Listener, verhindert jedoch nicht, dass der aktuelle Code abgeschlossen wird.

Versuchen:

if(!dataSnapshot.child("matches").exists()){ 
      ArrayList<String> matches = new ArrayList<String>(); 
      matches.add(match); 
      Firebase matchesRef = userRef.child("matches"); 
      matchesRef.setValue(matches); 
      userRef.removeEventListener(this); 
      return; 
     }else if(dataSnapshot.child("matches").exists()){ 
      Map<String, Object> matches = new HashMap<>(); 
      matches.put("matches", match); 
      userRef.child("matches").push().setValue(matches); 
      userRef.removeEventListener(this); 
     } 

Hinzufügen der return-Anweisung sollte die ganz aktuellen Anruf, und immer noch die Zuhörer deaktivieren, wie Sie beabsichtigten.

Verwandte Themen