Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Firebase数据库-检索深度嵌套数据_Java_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Java Firebase数据库-检索深度嵌套数据

Java Firebase数据库-检索深度嵌套数据,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我正在尝试使用POJO类检索深度嵌套的数据。以下是我的数据结构: { "Users": { "User1": { "Email": "dfs@sdf.com", "Last_login": "5:15pm", "Username": "Test", "Leagues": { "FootballLeague": true,

我正在尝试使用POJO类检索深度嵌套的数据。以下是我的数据结构:

{
    "Users": {
        "User1": {
            "Email": "dfs@sdf.com",
            "Last_login": "5:15pm",
            "Username": "Test",
            "Leagues": {
                "FootballLeague": true,
                "CricketLeague": true
            },
            "Season": {
                "2017": {
                    "Points": 5,
                    "Results": 2,
                    "Matchday": {
                        "Matchdaydata1": "data1",
                        "Matchdaydata2": "data2",
                        "Fixtures": {
                            "Fixturedata1": "data1",
                            "Fixturedata2": "data2"
                        }
                    }
                },
                "2018": {
                    "Points": 7,
                    "Results": 2,
                    "Matchday": {
                        "Matchdaydata1": "data1",
                        "Matchdaydata2": "data2",
                        "Fixtures": {
                            "Fixturedata1": "data1",
                            "Fixturedata2": "data2"
                        }
                    }
                }
            }
        }
    }
}
这是我的POJO课程:

    public class Users {

 private String Username;
 private String Email;
 private String Last_login;
 private Map < String, Boolean > Leagues;
 private Map < String, thisSeason > Season;

 public Users() {

 }

 //All getters and setters 

 public static class thisSeason {
  private int Points;
  private int Results;
  private Map < String, matchdayData > Matchday;

  public thisSeason() {}

  //getters and setters

  public static class matchdayData {

   private String Matchdaydata1;
   private String Matchdaydata2;
   private Map < String, fixtureData > Fixtures;

   public matchdayData() {

    }
    //getters and setters

   public static class fixtureData {
    private String Fixturedata1;
    private String Fixturedata2;

    public fixtureData() {}
    //Getters and setters

   }
  }
 }
}
公共类用户{
私有字符串用户名;
私人字符串电子邮件;
上次登录时的私有字符串;
私有映射<字符串,布尔>联盟;
私人地图<字符串,thisSeason>季节;
公共用户(){
}
//所有的能手和二传手
本季公共静态课程{
私人积分;
私人int结果;
私有地图Matchday;
公共本季(){}
//接球手和接球手
公共静态类matchdayData{
私有字符串Matchdaydata1;
私有字符串Matchdaydata2;
私有地图Fixtures;
公共matchdayData(){
}
//接球手和接球手
公共静态类fixtureData{
私有字符串Fixturedata1;
私有字符串Fixturedata2;
public fixtureData(){}
//接球手和接球手
}
}
}
}
下面是我如何访问侦听器中的数据:

        List<Users> usersList= new ArrayList<Users>();
DatabaseReference fbDB = FirebaseDatabase.getInstance().getReference();

        fbDB.child("Users").addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            if (dataSnapshot.exists()) {

                for (DataSnapshot ds : dataSnapshot.getChildren()) {
                    Users C = ds.getValue(Users.class);
                    usersList.add(C);

                }
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });


}
List usersList=new ArrayList();
DatabaseReference fbDB=FirebaseDatabase.getInstance().getReference();
fbDB.child(“用户”).addListenerForSingleValueEvent(新的ValueEventListener()){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
if(dataSnapshot.exists()){
对于(DataSnapshot ds:DataSnapshot.getChildren()){
Users C=ds.getValue(Users.class);
usersList.add(C);
}
}
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
}
问题:

我目前实施的是将所有数据存储到赛季积分/成绩。我可以毫无问题地找回这个

对于Matchday,我得到了空值-它甚至没有意识到在我的结构中它下面有数据。我如何解决这个问题


datasnapshot正确返回所有数据,似乎my POJO类没有正确设置以存储此嵌套结构

您的json似乎存在逗号和大括号错位/缺失的问题。我认为应该是这样的:

{
    "Users": {
        "User1": {
            "Email": "dfs@sdf.com",
            "Last_login": "5:15pm",
            "Username": "Test",
            "Leagues": {
                "FootballLeague": true,
                "CricketLeague": true
            },
            "Season": {
                "2017": {
                    "Points": 5,
                    "Results": 2,
                    "Matchday": {
                        "Matchdaydata1": "data1",
                        "Matchdaydata2": "data2",
                        "Fixtures": {
                            "Fixturedata1": "data1",
                            "Fixturedata2": "data2"
                        }
                    }
                },
                "2018": {
                    "Points": 7,
                    "Results": 2,
                    "Matchday": {
                        "Matchdaydata1": "data1",
                        "Matchdaydata2": "data2",
                        "Fixtures": {
                            "Fixturedata1": "data1",
                            "Fixturedata2": "data2"
                        }
                    }
                }
            }
        }
    }
}

避免在firebase中进行深嵌套。在深度嵌套的数据中进行迭代有时会很痛苦。此外,如果您想在当前数据中添加更多数据,您将继续深入。最好使用平面结构阅读更多内容。我建议您将季节数据保存在单独的节点中,并将userId添加为字段。通过使用平面结构,您可以查询数据的子集。尽管您可能需要进行多次调用,但最好使用一个较小的集合,以获得难以迭代的巨大json

对于这个特定的响应,您需要获得
matchdays
的值,您需要通过在要检索的子级上添加
ValueEventListener
来进行非常深入的查询

fbDB.child("Users").child("User1").child("Season"). child("2017").child("MatchDay")addListenerForSingleValueEvent....

是的,很抱歉,我在那里手动编写了JSON,因为我有比这更多的数据,只是为了这个问题的方便而尽量减少数据。JSON在现实中很好:-)我明白了。我发现重要的不是缺少大括号,而是缺少结果和比赛日之间的逗号,因为这就是你描述的问题所在。我将进一步研究Java代码,但我只是想指出,如果您确实缺少逗号,我将从Firebase导出JSON,然后剪切块-显然做得不太好!我现在已经在OP中更新了JSON,谢谢。谢谢你的问题,它解决了我的问题。你是如何解决这个问题的?