2016-03-28 5 views
0

Ich muss das Firebase-Schema durchlaufen, um Daten für jede workouts & Anzeige in einem RecyclerView zu erhalten. Jetzt kann ich nicht das Schema in der Firebase mit dem Listener & über POJO Klasse Program genannt.Wie durchläuft man eine Firebase-Struktur in Android?

JSON Von Firebase

{ 
    "subscriptions" : { 
    "[email protected],com" : { 
     "-KDnhRwHjssOejrqyenP" : { 
     "category" : "Strength", 
     "goal" : "This workout can be done while on the phone!", 
     "length" : 1, 
     "title" : "Hello Workouts", 
     "weeks" : { 
      "week1" : [ "High Knees", "Jumping Jacks", "Wall sit", "Pushups", "Sit-ups", "Step ups", "Squats", "Tricep dips on chair", "Plank", "High Knees running in place", "Lunges", "Pushup and rotation", "Side plank (alternate per round)", "Alternating Push-Up Plank", "Chest Expander", "Diamond Push-ups", "Dive Bomber Push-ups", "Butt Kickers", "Lying Triceps Lifts", "One Arm Side Push-up", "Overhead Arm Clap", "Overhead Press", "Power Circles", "Push-up and Rotation", "T Push-ups", "Reverse Plank", "Spiderman Push-up", "T Raise", "Tricep Dips", "Wall Push-ups", "Wide Arm Push-ups", "Burpees" ] 
     } 
     }, 
     "-KDni3TN4NMyGXePyp92" : { 
     "category" : "Strength", 
     "goal" : "This workout can be done by a BABUJI", 
     "length" : 1, 
     "title" : "Indian Workouts", 
     "weeks" : { 
      "week1" : [ "Diamond Pushups", "Jackknives", "Plyo Lunges", "Plyo Squats", "Single leg plank (alternate per round)", "Plyo Lunges", "Pushup and rotation", "Weighted side plank (alternate per round)", "Alternating Push-Up Plank", "Chest Expander", "Diamond Push-ups", "Dive Bomber Push-ups", "One Arm Side Push-up", "Overhead Press", "Push-up and Rotation", "T Push-ups", "Spiderman Push-up", "Wide Arm Push-ups", "Burpee Pushups" ] 
     } 
     } 
    }, 
    "[email protected],com" : { 
     "-KDnfjROKeFAL9wccsxY" : { 
     "category" : "Mobility", 
     "goal" : "afternoon body weight workout", 
     "length" : 1, 
     "title" : "Afternoon HiiT", 
     "weeks" : { 
      "week1" : [ "High Knees", "Squats", "Lunges", "Diamond Push-ups", "Lying Triceps Lifts" ] 
     } 
     }, 
     "-KDps90Dn6XtJc6Co00b" : { 
     "category" : "Strength", 
     "goal" : "goal", 
     "length" : 1, 
     "title" : "title", 
     "weeks" : { 
      "week1" : [ "Diamond Pushups", "Jackknives", "Plyo Lunges", "Plyo Squats", "Single leg plank (alternate per round)", "Plyo Lunges", "Pushup and rotation", "Weighted side plank (alternate per round)", "Alternating Push-Up Plank", "Chest Expander", "Diamond Push-ups", "Dive Bomber Push-ups", "One Arm Side Push-up", "Overhead Press", "Push-up and Rotation", "T Push-ups", "Spiderman Push-up", "Wide Arm Push-ups", "Burpee Pushups" ] 
     } 
     } 
    } 
    } 
    } 

Listener CODE

public void FB(){ 
ref.addValueEventListener(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot snapshot) { 
        for (DataSnapshot postSnapshot: snapshot.getChildren()) { 
         System.out.println(postSnapshot.getValue()); 
    //Program post = proSnapshot.getValue(Program.class); 
        } 
       } 
       @Override 
       public void onCancelled(FirebaseError firebaseError) { 
        System.out.println("The read failed: " + firebaseError.getMessage()); 
       } 
      }); 
     } 

Logcat

03-28 08: 52: 53,966 23.584-23.584/com. android.sam Ich/System .out: {-KDni3TN4NMyGXePyp92 = {weeks = {week1 = [Diamond Liegestütze, Jackknives, Plyo Lunges, Plyo Kniebeugen, Einbeinsteg (abwechselnd pro Runde), Plyo Lunges, Pushup und Rotation, Belastete Seitenplanke (abwechselnd pro Runde), Abwechselnd Push-Up Plank, Brust Expander, Diamond Push-ups, Tauchbomber Liegestütze, Einarmige Seite Push-up, Overhead Presse, Push-up und Rotation, T Liegestütze, Spiderman Push-up, Wide Arm Push- Ups, Burpee Pushups]}, title = Indian Workouts, Kategorie = Stärke, Länge = 1, Ziel = Dieses Workout kann von einem BABUJI ​​durchgeführt werden}, -KDnhRwHjssOejrqyenP = {weeks = {week1 = [Hohe Knie, Springende Buben, Wall sit , Liegestütze, Sit-ups, Step-Ups, Kniebeugen, Trizeps Dips auf Stuhl, Plank, hohe Knie laufen an Ort und Stelle, Lunges, Pushup und Rotation, Side Plank (abwechselnd pro Runde), Alternierende Push-Up Plank, Expander, Diamond Push -ups, Tauchbomber Liegestütze, Butt Kickers, Liegende Trizepslifte, Einarmige Seiten Liegestütze, Overhead Arm Clap, Overhead Press, Power Circles, Liegestütz und Rotation, T Liegestütze, Reverse Plank, Spiderman Push-up, T Heben, Trizeps Dips, Wand Push-ups, Breitarm Push-ups, Burpees]}, title = Hallo Workouts, Kategorie = Stärke, Länge = 1, Ziel = Dieses Workout kann während des Telefonierens durchgeführt werden! }}

03-28 08: 52: 53,967 23.584-23.584/com.android.sam I/System.out: {-KDnfjROKeFAL9wccsxY = {Wochen = {week1 = [Hoch Knees, Squats, Lunges, Diamant Push- ups, Liegende Trizepslifte]}, title = Nachmittag HiiT, Kategorie = Mobilität, Länge = 1, Ziel = nachmittags Körpergewicht Workout}, -KDps90Dn6XtJc6Co00b = {Wochen = {Woche1 = [Diamond Pushups, Jackknives, Plyo Lunges, Plyo Squats, Einbeinige Planke (abwechselnd pro Runde), Plyo Lunges, Pushup und Rotation, Belastete Seitenplanke (abwechselnd pro Runde), Alternierende Push-Up Planke, Expander, Diamond Push-Ups, Tauchbomber Push-ups, One Arm Side Push- oben, Overhead-Presse, Push-up und Rotation, T-Push-ups, Spiderman Push-up-, Wide-Arm-Push-ups, Burpee-Liegestütze]}, title = Titel, Kategorie = St rength, Länge = 1, Ziel = Ziel}}

Program.java

public class Program { 
    private String title; 

    private String goal; 

    private String category; 

    private int length; 

    HashMap<String, ArrayList<String>> weeks; 

    /** 
    * Required public constructor 
    */ 
    public Program() { 
    } 

    public Program(String title, String goal, String category, int length, HashMap<String, ArrayList<String>> weeks) { 
     this.title = title; 
     this.goal = goal; 
     this.category = category; 
     this.length = length; 
     this.weeks = weeks; 
    } 

    public String getTitle() { 
     return title; 
    } 

    public String getGoal() { 
     return goal; 
    } 

    public String getCategory() { 
     return category; 
    } 
    public int getLength() { 
     return length; 
    } 
    public HashMap<String, ArrayList<String>> getweeks() { 
     return weeks; 
    }  
} 
+0

Was ist das Problem? Haben Sie schon versucht, eine Karte zu erstellen? –

+0

Ich habe eine POJO-Klasse namens Program, um das Mapping durchzuführen. Aber ich kann die Daten nicht innerhalb der Push ID durchsuchen und abrufen? – user3467240

+0

Ich vermute, es wird ein Fall von 'DataSnapshot.forEach()', aber es ist immer noch sehr unklar. Welcher Knoten im JSON erstellt eine 'Program'-Klasse? Wie sieht die 'Program' Klasse aus (füge an, was du bereits dafür hast)? –

Antwort

3

Wie @ReazMurshed sagte, bist du fast da. Aber Sie können nicht über eine Ebene in Ihrem Baum iterieren. Scheinbar verweist ref auf den Knoten subscriptions in Ihrem JSON. Darunter haben Sie Benutzer und dann haben Sie die Push-IDs. Also müssen Sie eine doppelte Schleife machen:

ref.addListenerForSingleValueEvent(new ValueEventListener) { 
    public void onDataChange(DataSnapshot snapshot) { 
    if (dataSnapshot.exists()) { 
     for (DataSnapshot userSnapshot : snapshot.getChildren()) { 
     for (DataSnapshot programSnapshot : userSnapshot.getChildren()) { 
      Program program = programSnapshot.getValue(Program.class); 
     } 
    } 
    } 

    public void onCancelled(FirebaseError firebaseError) { 

    } 
}); 
+0

Ich habe gestern die Doppelschleife versucht. Aber ich habe nicht mit 'addListenerForSingleValueEvent' versucht. Vielen Dank für Ihre Hilfe! – user3467240

+0

Die doppelte Schleife würde das gleiche mit 'addValueEventListener()' funktionieren. Wenn Sie jedoch 'addChildEventListener()' verwenden, benötigen Sie nur eine einzige Schleife, da der Rückruf bereits mit einem 'DataSnapshot' jedes einzelnen Benutzers ausgelöst würde. –

+0

Sehr saubere Antwort. Zuerst konnte ich sein Problem nicht vollständig verstehen. Obwohl ich diese Lösung nicht gefunden habe, bist du da. Ich dachte daran, den Knoten in einer Liste von 'Program'-Klasse zu binden. Wird es funktionieren? @FrankvanPuffelen –

3

Sie sind fast da. Sie müssen nur den Listener addListenerForSingleValueEvent mit Ihrer Referenz hinzufügen, um die mit dem Referenzknoten verknüpften Daten zu durchlaufen. Hier ist ein Beispiel, wie es gemacht werden könnte.

In Ihrem Fall lässt erklären, nur eine Klasse namens ProgramList

public class ProgramList { 
    public List<Program> mProgramList; 
} 

Nun Bezug auf die an die E-Mail-Adresse Knoten erhalten und einen Listener hinzufügen.

ref.addListenerForSingleValueEvent(new ValueEventListener) { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     if (dataSnapshot.exists()) { 
      for (DataSnapshot programSnapshot : dataSnapshot.getChildren()) { 
       final ProgramList mProgramList = programSnapshot.getValue(ProgramList.class); 

       // Now iterate through the list here. 
      } 
     } 
    } 

    @Override 
    public void onCancelled(FirebaseError firebaseError) { 

    } 
}); 

Sie könnten wieder die firebase documentation für das Abrufen von Daten in android überprüfen.This is an example der gleichen Datenbankstruktur wie Sie hier haben.

+0

Es funktioniert nicht, weil wir nach der Push ID suchen müssen. Damit kann er die Daten von dort holen. Momentan ist es die Push-ID im Snapshot. So gibt es zurück "Fehler beim Springen auf Typ" Ausnahme! – user3467240

+0

"Fehler beim Springen zum Typ" bedeutet, dass Ihr Programm-POJO nicht mit dem in der Firebase-Datenbank verwendeten Programm identisch ist. Entfernen Sie Ihre Getter und Setter von Ihrem POJO und versuchen Sie es erneut. –

+0

Unbekanntes Feld "-KDni3TN4NMyGXePyp92" (Klasse com.android.sam), nicht als ignorierbar gekennzeichnet (0 bekannte Eigenschaften:)) – user3467240

Verwandte Themen