2016-06-01 1 views
2

Dies ist mein Code zum Hinzufügen von Personenobjekt in Firebase.So holen Sie alle Daten nach dem Hinzufügen neuer Daten in der Firebase-Datenbank

FirebaseDatabase database = FirebaseDatabase.getInstance(); 
    DatabaseReference myRef = database.getReference("Person"); 


    buttonSave.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 

      String name = editTextName.getText().toString().trim(); 
      String address = editTextAddress.getText().toString().trim(); 

      //Creating Person object 
      Person person = new Person(); 
      person.setName(name); 
      person.setAddress(address); 
      new Firebase(Config.FIREBASE_URL).child("Person").push().setValue(person); 
     } 
    }); 

    myRef.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) { 
       //Getting the data from snapshot 
       Person person = postSnapshot.getValue(Person.class); 

       //Adding it to a string 
       String string = "Name: " + person.getName() + "\nAddress: " + person.getAddress() + "\n\n"; 

       //Displaying it on textview 
       textViewPersons.setText(string); 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      System.out.println("The read failed: " + databaseError.getMessage()); 
     } 
    }); 

Das Hinzufügen von Daten funktioniert gut und jeder fügt einen neuen Schlüssel für die Person hinzu.

Aber addValueEventListener zeigt mir nur zuletzt hinzugefügten Eintrag. Ich möchte alle Einträge Daten.

Kann mir jemand dabei helfen?

+0

Haben Sie überprüfen, ob Sie alle 'ersetzten myRef 's zufrieden mit der neuen Person? – Sunshinator

Antwort

2

Jedes Mal, wenn sich im Knoten Person etwas ändert, werden Sie über onDataChange() benachrichtigt. Dort Sie Schleife über die Menschen und dann für jeden Anruf:

textViewPersons.setText(string); 

Also sind ersetzen Sie ständig den Inhalt der Textansicht mit der Information von jeder Person. Nach jeder Schleife werden nur die Informationen für den letzten Benutzer angezeigt. Sie können leicht erkennen, dass der Code durch alle Menschen Schleifen durch Zugabe:

System.out.println(string); 

Damit Sie jede Person in logcat sehen werden, aber nur die letzte Person in der Textansicht.

Eine Lösung ist entweder eine ListView oder RecyclerView zu verwenden, die beiden Listen von Elementen behandeln. Weitere (schneller implementieren) Art und Weise alle Benutzer zu zeigen, es die Strings in der Textansicht anhängen:

textViewPersons.setText(textViewPersons.getText()+string+"\n"); 
0

die Sie interessieren, wenn es hilft:

String dataviewer=new String(); 

Firebase firebase=new Firebase(Config.FIREBASE_URL); 

buttonSave.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) { 

     String name = editTextName.getText().toString().trim(); 
     String address = editTextAddress.getText().toString().trim(); 

     //Creating Person object 
     Person person = new Person(); 
     person.setName(name); 
     person.setAddress(address); 
     new Firebase(Config.FIREBASE_URL).child("Person").push().setValue(person); 
    } 
}); 

    firebase.child("Person").addChildEventListener(new ChildEventListener() { 
     // Retrieve values as they are added to Firebase 
     @Override 
     public void onChildAdded(DataSnapshot snapshot, String previousChildKey) { 

      Map<String,Object> vals=(Map<String,Object>)snapshot.getValue(); 
      String name_person=String.valueOf(vals.get("name")); 
      String address_person=String.valueOf(vals.get("address")); 
      dataviewer+="Name: " + name_person + "\nAddress: " + address_person + "\n\n"; 
      } 

     @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(FirebaseError firebaseError) { 

     } 
    });