Reputation: 921
I need to traverse the Firebase schema to get data for each workouts
& display it in a RecyclerView.
Now I can't traverse the Schema in the Firebase using the listener & get it via POJO Class called Program
.
JSON From Firebase
{
"subscriptions" : {
"han@gmail,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" ]
}
}
},
"obama@gmsil,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 23584-23584/com.android.sam I/System.out: {-KDni3TN4NMyGXePyp92={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]}, title=Indian Workouts, category=Strength, length=1, goal=This workout can be done by a BABUJI}, -KDnhRwHjssOejrqyenP={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]}, title=Hello Workouts, category=Strength, length=1, goal=This workout can be done while on the phone!}}
03-28 08:52:53.967 23584-23584/com.android.sam I/System.out: {-KDnfjROKeFAL9wccsxY={weeks={week1=[High Knees, Squats, Lunges, Diamond Push-ups, Lying Triceps Lifts]}, title=Afternoon HiiT, category=Mobility, length=1, goal=afternoon body weight workout}, -KDps90Dn6XtJc6Co00b={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]}, title=title, category=Strength, length=1, goal=goal}}
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;
}
}
Upvotes: 0
Views: 2006
Reputation: 24211
You're almost there. You just need to add addListenerForSingleValueEvent
listener with your reference to iterate through the data associated with the reference node. Here's an example of how it could be done.
In your case, lets just declare a class named ProgramList
public class ProgramList {
public List<Program> mProgramList;
}
Now get reference to the to the email address node and add a listener to it.
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) {
}
});
You might check the firebase documentation for retrieving data in android again. This is an example of a same database structure like you have here.
Upvotes: 3
Reputation: 598740
As @ReazMurshed said, you're almost there. But you're failing to iterate over one level in your tree. It seems that ref is pointing to the subscriptions
node in your JSON. Under that you have users and then you have the push ids. So you'll need to do a double loop:
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) {
}
});
Upvotes: 3