2017-10-05 159 views
0

我无法检索嵌套在“联盟”和“季节”中的数据。Firebase数据库 - 无法检索嵌套数据

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

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

"Users" : 
    "User1" : { 
     "Email" : "[email protected]", 
     "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) { 

     } 
    }); 


} 

我得到一个空对象再如上面的代码所示。

此外,稍微注意一点 - 我知道我的获取联盟的实施是不正确的。我如何检索密钥?

+0

通常我的onDataChange方法中,我使用 串串= datasnapshot.getValue(String.class); Textview.setText(string); 来获取数据。 –

回答

0

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

首先,你Leagues对象: 嗯,这不应该是一个自定义对象所有,如果停留在目前的结构,但MapThis是地图对象 - 具有keyvalue的集合,就像Realtime Database中的孩子一样。

如果一个联盟名称(=键)没有一个true(=值)旁边 - 的名字可能已存储在String变量,但这种情况并非如此,因为在Realtime Database必须每一个孩子具有价值,并在联赛名称旁边存储“虚拟”值使每个联盟成为Map的一部分。这个当前的“虚拟”是boolean,这就是为什么这将是联赛的数据类型:Map<String, Boolean> leagues


其次,你的Season对象: 你是一个赛季,很多季节之间的混淆。你的孩子 - “季节”实际上储存了很多季节。这就是为什么这种情况会类似于上面的情况 - 每个季节的时间是key,季节本身是value


因此,用户类的变量应该是:

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

我按照上面的建议对User类进行了更改,但在尝试访问嵌套数据时仍然收到空对象引用错误。与我在代码中评论为“ERROR”的位置相同,我试图像这样访问它。 – PSLDev

+0

请更新您的代码和问题中的当前数据结构,这样可以更容易地为您提供帮助。 –

+0

我已经更新了我的JSON和代码,以反映我现在拥有的。 – PSLDev