【问题标题】:Firebase Database - Retrieving deeply nested dataFirebase 数据库 - 检索深度嵌套的数据
【发布时间】:2018-03-19 23:10:06
【问题描述】:

我正在尝试使用 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

   }
  }
 }
}

这是我在侦听器中访问数据的方式:

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

        }
    });


}

问题:

我目前实现的是将所有数据存储到季节下的 Points/Results。我可以毫无问题地检索它

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

datasnapshot 正确返回所有数据,好像我的 POJO 类没有正确设置来存储这个嵌套结构

【问题讨论】:

  • 谢谢你的问题,它解决了我的问题
  • 你是怎么解决这个问题的?

标签: java android firebase firebase-realtime-database


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    您的 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"
                            }
                        }
                    }
                }
            }
        }
    }
    

    【讨论】:

    • 是的,对不起,我在那里手动编写了 JSON,因为我有比这更多的数据,只是想为了这个问题的方便而最小化数据。 JSON 在现实中很好:-)
    • 我明白了。我发现似乎很重要的事情不是缺少大括号,而是 Results 和 Matchday 之间缺少逗号,因为那是您描述有问题的地方。我会多看一些 Java 代码,但我只是想指出这一点,以防您实际上缺少逗号。
    • 我从 Firebase 中导出了 JSON,然后切出了一些块 - 显然做得不太好!不过,我现在已经更新了 OP 中的 JSON,谢谢。
    猜你喜欢
    • 2017-02-12
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多