Firebase数据库 - 无法检索嵌套数据

时间:2017-10-05 18:56:20

标签: java android firebase firebase-realtime-database

我无法检索嵌套在" Leagues"内的数据。和"季节"。

在下面的数据库中,我无法检索2016/2017季度积分和结果。

我能够访问未嵌套的数据,例如电子邮件和用户名,没有问题

"Users" : 
    "User1" : {
      "Email" : "dfs@sdf.com",
      "Last_login" : "5:15pm",
      "Username" : "Test",
      "Leagues" : {
        "FootballLeague" : true,
        "CricketLeague" : true
      },
      "Season" : {
         "2017" : {
               "Points" : 5,
               "Results" : 2
               "newdata" : {
                     "randomdata1: data1",
                     "randomdata2: data2"
                           },
                 }
         "2018" : {
                "Points" : 7,
                "Results" : 2
      }
}

以下类是我用来将数据存储为对象的类:

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 for the strings. 

public Map<String, Boolean> get_joined_Leagues() {
   return Leagues;
}

public void set_joined_Leagues(Map<String, Boolean> leagues) {
  Leagues = leagues;
}


public Map<String, thisSeason> getSeason() {
   return Season;
}

public void set_thisSeason(Map<String, thisSeason> season) {
  Season = season;
}

public static class thisSeason {
private int Points;
private int Results;
private Map <String, thisNewData> newdata;

    public thisSeason() {
    }

    public int getthisSeason_results() {
        return Results;
    }

    public void setthisSeason_results(int resultsin) {
        Results = resultsin;
    }

    public int getthisSeason_points() {
        return Points;
    }

    public void setSeason_points(int Pointsin) {
        Points = Pointsin;
    }

    public Map<String, thisNewData> getNewData() {
   return newdata;
    }

    public void set_thisNewData(Map<String, thisNewData> newdata_in) {
    newdata= newdata_in;
    }

    public static class thisNewData {
      private String randomdata1;
      private String randomdata2;

      //Getters and Setters
      }

以下是我访问数据库的Java类的一部分:

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

                    System.out.println(C.getSeason().getthisSeason_points()); //ERROR occurs here - null object reference

                }
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });


}

我得到一个空对象引用错误,如上面的代码所示。

另外,从侧面说明 - 我知道我的联赛实施不正确。我该如何检索密钥呢?

1 个答案:

答案 0 :(得分:0)

我在您的代码中发现的主要问题:

首先,您的Leagues对象: 好吧,如果它保留在当前结构中,它应该不是自定义对象,而是MapThis是地图对象 - 具有keyvalue的集合,就像Realtime Database中的孩子一样。

如果联赛名称(=键)旁边没有true(=值) - 名称可能已存储在String变量中,但这不是case,因为Realtime Database中的每个孩子都必须有一个值,并存储一个&#34; dummy&#34;联盟名称旁边的值使每个联盟成为Map的一部分。这个电流&#34;虚拟&#34;是一个boolean,这就是为什么这将是联盟&#39;数据类型:Map<String, Boolean> leagues

其次,您的Season对象: 你在一个赛季和很多赛季之间都很困惑。你的孩子 - &#34;赛季&#34;实际上存储了很多季节。这就是为什么这个案例与上面的案例类似 - 每个季节的时间是key,而季节本身就是value

因此,User类的变量应为:

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