2017-02-14 4 views
0

Ich erstelle eine App mit Firebase. Es gibt ein Problem, das ich nicht lösen kann, und habe es hier nicht besprochen.Android - onDataChange() seltsames Verhalten

In dieser Methode möchte ich überprüfen, ob einige Daten bereits im Server vorhanden sind. Wenn nicht - ich möchte es hinzufügen (der Code des Hinzufügens funktioniert gut. Die Firebase-Datenbank wird geändert, wie ich möchte). also verwende ich OnDataChange Methode, wie folgend:

public boolean insertNewList(String title) 
{ 
    System.out.println("start: "); 

    final boolean[] result = new boolean[1]; 
    result[0]=false; 

    final String group = title; 

    mRootRef = some reference... 



    mRootRef.addValueEventListener(new ValueEventListener() 
    { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) 
     { 

      System.out.println(0); 

      if (dataSnapshot.child(group).getValue() != null) 
      { 
       System.out.println(group + " is already exist"); 
       System.out.println(1); 

      } 

      //write the data. 
      else 
      { 
       mRootRef=mRootRef.child(group); 
       mRootRef.push().setValue("some data"); 
       System.out.println(2); 
       result[0]=true; 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) 
     { 

     } 
    }); 


    System.out.println(3); 

    return result[0]; 
} 

Aber was wirklich passiert, ist dieser Ausgang:

begin: 
3 (just skip on onDataChange method and return false). 
some print after calling the function 
0 (goes back to function and enter to onDataChange method) 
2 (finally goes where I want it to go) 
0 (for some reason enters twice :( ) 
1 

Und wegen, dass ich erhalten falsche Ergebnisse in dieser Funktion. Können Sie bitte helfen?

+0

sorry- Ich ersetzte "Start" durch "Beginne", aber es spielt keine Rolle. – ayelet

Antwort

0

ersetzen

mRootRef.addValueEventListener(new ValueEventListener() 

mit

mRootRef.addListenerForSingleValueEvent(new ValueEventListener() 

Wenn Sie die den Wert auf Firebase "addValueEventListener" genannt wieder, nicht wie addListenerForSingleValueEvent dass Aufnahmen nur einmal anywhy hinzufügen.

+0

danke! löste meine Frage, warum es zweimal eintritt. Es macht keinen Sinn, wenn ich den Server frage, ob ein Wert vorhanden ist - und wenn nein, werde ich es als 2 Aktionen anstelle von eins nehmen. – ayelet

0

Die Ausgabe, die Sie uns gezeigt haben, sieht normal für mich aus. Lassen Sie mich versuchen zu erklären:

begin: // a) this comes from the System.out.println("begin") 
3  // b) you DECLARE your value event listener and then you run 
     // the System.out.print("3") statement 
0  // c) you just added a listener so firebase calls you, and 
     // your listener fires 
2  // d) this is the first time your listener fires, so you go 
     // into the block called "write the data" 
0  // e) since you just wrote the data, firebase calls you again 
1  // f) this time, since the data has been written, you go into 
     // the block called "is alraedy exist" 

Dies ist normales Verhalten für Firebase. In c) ruft Firebase Sie immer einmal zurück, wenn Sie einen Listener deklarieren. In e) ruft Firebase Sie, weil die Daten geändert haben. Aber in b) deklarieren Sie nur Ihren Listener, noch nicht, so dass die Anweisungen nach dieser Deklaration ausgeführt werden und Sie "3" sehen, bevor etwas anderes passiert.

+0

danke für deinen Kommentar. Ich verstehe jetzt, dass diese Methode nicht so funktioniert, wie ich es erwartet habe, aber wie du erwähnt hast. Ich dachte, dass der Listener auftritt und erst dann - Rückgabewert von der Funktion. – ayelet