2017-11-12 1 views
0

Ich fange an, Android Apps mit der Datenbankverbindung zu codieren. Als IDE verwende ich Android Studio und Firebase für die Datenbank. Das ist meine Datenstruktur in Firebase: enter image description hereGet Firebase Daten von bestimmten Kind

In meiner App muss ich einen ListView mit allen Namen ausfüllen. Ich möchte also die Daten von drei Kindern vom Kind "Rezepte" vom UUID-Kind. Ich hoffe, das ist verständlich.

Ich habe viel gegoogelt und ich kann einfach nicht herausfinden, wie das funktioniert. Meine aktuelle Version des Java-Code ist dies:

final FirebaseUser user = firebaseAuth.getCurrentUser(); 
    // trying to get the reference of the right path 
    DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child(user.getUid()).child("Rezepte"); 
    ref.addListenerForSingleValueEvent(
      new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        // calling a method which should read the data from the snapshot and put it into the ListView 
        fillList((Map<String, Object>) dataSnapshot.child(user.getUid()).child("Rezepte").getValue()); 
       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 
        Toast.makeText(RezepteActivity.this, "Daten konnten nicht gelesen werden", Toast.LENGTH_SHORT).show(); 
       } 
      }); 
} 

private void fillList(Map<String, Object> entries) { 

    // loop to cycle through every child of "Rezepte" and get the names 
    for (Map.Entry<String, Object> entry : entries.entrySet()) { 
     Map singleEntry = (Map) entry.getValue(); 
     // add the name to an ArrayList of all names 
     Rezepte.add((String) singleEntry.get("name")); 
    } 
    // put the data into the ListView 
    lvRezepte.addFooterView(lvRezepte, Rezepte, true); 
} 

Die App immer abstürzt und ich verstehe nicht wirklich viel im Debugger. Aber der Fehler tritt bereits in der onDataChange void auf.

Ich wäre wirklich glücklich, wenn mir jemand helfen könnte.

Antwort

0

Sie versuchen, die Hierarchie in Ihrem Ergebnis DataSnapshot zu durchlaufen, wenn Sie dies bereits in Ihrer Abfrage selbst getan haben. Also in Ihrem OnDataChange() Sie müssen nur sagen:

fillList(datasnapshot.getValue()) //Map of results at /{uid}/Rezepte 
0

Unter der Annahme, dass fillList Methode funktioniert, sollten Sie zuerst beheben Sie die folgende Zeile

fillList((Map<String, Object>) dataSnapshot.child(user.getUid()).child("Rezepte").getValue()) 

zu

fillList((Map<String, Object>) dataSnapshot.getValue())

Sie haben bereits einen Verweis auf Rezepte Kind des aktuellen Benutzers, wenn Sie es wie folgt deklariert: DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child(user.getUid()).child("Rezepte")

Ihr Schnappschuss hat 1, 2 und 3 als Kinder, so dass Sie nicht den Pfad verstärken, sollten Sie in der Referenz erklärt.

0

Um alle diese Namen zu erhalten und fügen Sie sie zu einem ArrayList, benutzen Sie bitte den folgenden Code verwenden:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference(); 
DatabaseReference rezepeteRef = rootRef.child(user.getUid()).child("Rezepte"); 
ValueEventListener eventListener = new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     List<String> list = new ArrayList<>(); 
     for(DataSnapshot ds : dataSnapshot.getChildren()) { 
      String name = ds.child("name").getValue(String.class); 
      list.add(name); 
      Log.d("TAG", name); 
     } 
     Log.d("TAG", list); 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) {} 
}; 
rezepeteRef.addListenerForSingleValueEvent(eventListener);