2017-04-14 3 views
1

Ich arbeite an Android-App, in der ich eindeutige IDs der Benutzer in Firebase-Datenbank speichern möchte, um dies zu erreichen, habe ich eine Wurzel, namens "Benutzer" erstellt und speichert alle die eindeutigen IDs des Benutzers in diesem Stamm.Kontrolle des Auftretens von onChildAdded Ereignis in Firebase-Datenbank

Um die Eindeutigkeit zu überprüfen, muss ich jedes Kind von "Users" durchlaufen und nach Überprüfung der Eindeutigkeit werde ich die UniqueID zum "Users" root hinzufügen oder den Benutzer benachrichtigen, dass uniqueId nicht verfügbar ist.

Wenn ich Einzigartigkeit zu überprüfen, ist es conditionals (if/else) vor dem Auftreten eines Ereignisses OnChildAdded ausführen, wie einige Code auszuführen (erwähnt in meinem Code) nach dem Auftreten OnChildAdded Ereignis

My-Code

postBtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       if(!uniqueIdText.getText().toString().trim().equals("")) { 
        uniqueness = true; 
        users.addChildEventListener(new ChildEventListener() { 
         @Override 
         public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
          if (dataSnapshot.getKey().equals(uniqueIdText.getText().toString().trim())) 
           uniqueness = false; 

         } 

         @Override 
         public void onChildChanged(DataSnapshot dataSnapshot, String s) { 

         } 

         @Override 
         public void onChildRemoved(DataSnapshot dataSnapshot) { 

         } 

         @Override 
         public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

         } 

         @Override 
         public void onCancelled(DatabaseError databaseError) { 

         } 

        }); 
       } 
       else if(uniqueIdText.getText().toString().trim().equals("")) 
        Toast.makeText(LoginActivity.this,"Please enter id",Toast.LENGTH_LONG).show(); 

       //======================How to execute it(code below) after occurrence of OnChildAdded event==================== 
        if (uniqueness){ 
         DatabaseReference usersInfo = users.child(uniqueIdText.getText().toString().trim()); 
         startActivity(new Intent(LoginActivity.this, MainActivity.class)); 
        } 
        else{ 
         if(!uniqueIdText.getText().toString().trim().equals("")) 
          Toast.makeText(LoginActivity.this, "ID not available, Please enter a new one", Toast.LENGTH_SHORT).show(); 
        } 


      } 
     }); 

Antwort

1

Es gibt keine Möglichkeit zu wissen, wann alle Ereignisse aufgerufen wurden. Sie können jedoch wissen, wann die ersten Daten aus der Datenbank mithilfe von ValueEventListener synchronisiert wurden.

Aber in diesem Fall würde ich hoch empfehlen, einen anderen Ansatz zu nehmen. Das Herunterladen aller UIDs, um zu prüfen, ob ein Wert vorhanden ist, ist unglaublich ineffizient und wird nicht skaliert. Fügen Sie stattdessen einen Listener an die gesuchte UID an. Wenn dieser Wert existiert, erhalten Sie den Wert. Wenn es nicht existiert, erhalten Sie eine leere Momentaufnahme:

users.child(uniqueIdText.getText().toString()).addSingleValueEventListener(@Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     if (dataSnapshot.exists()) { 
      uniqueness = false; 
     } 
     else { 
      uniqueness = true; 
     } 
     ... 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     Log.w(TAG, "onCancelled", databaseError.toException()); 
     // ... 
    } 
}; 
Verwandte Themen