Java 如何在Android中遍历Firebase结构?

Java 如何在Android中遍历Firebase结构?,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我需要遍历Firebase模式以获取每个训练的数据&将其显示在RecyclerView中。 现在我无法使用侦听器遍历Firebase中的模式&通过名为Program的POJO类获取它 来自Firebase的JSON { "subscriptions" : { "han@gmail,com" : { "-KDnhRwHjssOejrqyenP" : { "category" :

我需要遍历Firebase模式以获取每个
训练的数据
&将其显示在RecyclerView中。 现在我无法使用侦听器遍历Firebase中的模式&通过名为
Program
的POJO类获取它

来自Firebase的JSON

{
  "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" ]
        }
      }
    }
  }
  }
侦听器代码

    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=[菱形俯卧撑,折刀式俯卧撑,俯卧撑蹲,单腿板(每轮交替),俯卧撑,旋转,负重侧板(每轮交替),交替俯卧撑,胸部扩张器,菱形俯卧撑,俯卧撑,单臂侧俯卧撑,头顶按压,俯卧撑和旋转,T型俯卧撑,蜘蛛人俯卧撑,宽臂俯卧撑,Burpee俯卧撑]},标题=印度训练,类别=力量,长度=1,目标=这项训练可以由巴布吉完成,-KDnhRwHjssOejrqyenP={周={周1=[高膝、跳高、壁坐、俯卧撑、仰卧起坐、跨步、下蹲、三头肌在椅子上俯卧撑、木板、高膝原地跑、弓箭步、俯卧撑和旋转、侧板(每轮交替),交替俯卧撑,胸部扩张器,菱形俯卧撑,俯卧撑,踢腿者,卧式三头肌举,单臂侧俯卧撑,上臂拍打,俯卧撑,力量圈,俯卧撑和旋转,T型俯卧撑,反向俯卧撑,蜘蛛人俯卧撑,T型仰卧撑,三头肌俯卧撑,壁式俯卧撑,宽臂俯卧撑,Burpees]},title=你好训练,category=力量,length=1,goal=这项训练可以在打电话时完成!}

03-28 08:52:53.967 23584-23584/com.android.sam I/System.out:{-KDnfjROKeFAL9wccsxY={weeks={week1=[高膝、深蹲、弓箭步、菱形俯卧撑、卧位三头肌举]},title=下午HiiT,category=机动性,长度=1,目标=下午体重训练},-KDps90Dn6XtJc6Co00b={weeks={week1=[菱形俯卧撑、弯刀式俯卧撑、俯卧撑弓箭步、俯卧撑下蹲、单腿板(每轮交替)、俯卧撑弓箭步、俯卧撑和旋转、加重侧板(每轮交替),交替俯卧撑板,胸部扩张器,菱形俯卧撑,俯卧撑,单臂侧俯卧撑,头顶按压,俯卧撑和旋转,T型俯卧撑,蜘蛛侠俯卧撑,宽臂俯卧撑,圆背俯卧撑]},标题=标题,类别=力量,长度=1,目标=目标}

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;
    }    
}
公共类程序{
私有字符串标题;
私有字符串目标;
私有字符串类别;
私有整数长度;
HashMap周;
/**
*必需的公共构造函数
*/
公共计划(){
}
公共程序(字符串标题、字符串目标、字符串类别、整数长度、HashMap周){
this.title=标题;
这个。目标=目标;
this.category=类别;
这个长度=长度;
本周=周;
}
公共字符串getTitle(){
返回标题;
}
公共字符串getGoal(){
回归目标;
}
公共字符串getCategory(){
退货类别;
}
公共整数getLength(){
返回长度;
}
公共HashMap getweeks(){
返回周;
}    
}

您就快到了。您只需添加带有引用的
addListenerForSingleValueEvent
listener,就可以迭代与引用节点关联的数据。下面是一个如何实现的示例

在您的例子中,让我们只声明一个名为
ProgramList

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

您可能会再次检查android中的数据检索。使用与此处相同的数据库结构。

您就快到了。您只需使用引用添加
addListenerForSingleValueEvent
侦听器,即可迭代与引用节点关联的数据。下面是一个示例

在您的例子中,让我们只声明一个名为
ProgramList

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

您可能会再次检查android中的数据检索。使用与此处相同的数据库结构。

正如@ReazMurshed所说,您就快到了。但是您没有在树中的一个级别上进行迭代。似乎ref指向JSON中的
订阅
节点。在该节点下,您有用户,然后您有e推送ID。因此您需要执行双循环:

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) {

  }
});

正如@ReazMurshed所说,您就快到了。但是您无法在树中的一个级别上进行迭代。似乎ref指向JSON中的
订阅
节点。在该节点下,您有用户,然后有推送ID。因此,您需要进行双循环:

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) {

  }
});

问题出在哪里?您是否尝试过进行任何映射?我有一个名为Program的POJO类来进行映射。但是我无法遍历并获取Push ID中的数据?我猜这将是
DataSnapshot.forEach()的情况
,但仍然很不清楚。
程序
类映射到JSON中的哪个节点?
程序
类看起来像什么(将您已经拥有的添加到问题中)?@FrankvanPuffelen每个训练都映射到程序POJO。将POJO添加到问题中!问题出在哪里?您是否尝试进行任何映射?我有一个名为Program的POJO类来进行映射。但是我无法遍历并获取Push ID中的数据?我猜这将是一个
DataSnapshot.forEach()的情况
,但仍然很不清楚。
程序
类映射到JSON中的哪个节点?
程序
类看起来像什么(将您已经拥有的添加到问题中)?@FrankvanPuffelen每个训练都映射到程序POJO。将POJO添加到问题中!它不起作用,因为我们必须在推ID之后遍历。这样它才能从那里获取数据。目前,它在快照中包含推ID。因此它返回“未能跳转到类型”异常!未能跳转到类型表示您的程序POJO与您在Firebase数据库中使用的程序不同。请删除