【问题标题】:Firebase Database - Unable to retrieve nested dataFirebase 数据库 - 无法检索嵌套数据
【发布时间】:2017-10-08 22:20:50
【问题描述】:

我无法检索嵌套在“联赛”和“赛季”中的数据。

在下面的数据库中,我无法检索 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) {

        }
    });


}

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

另外,顺便说一句 - 我知道我获得联赛的实施是不正确的。我怎样才能取回密钥?

【问题讨论】:

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

标签: java android firebase firebase-realtime-database


【解决方案1】:

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

首先,您的Leagues 对象: 好吧,如果它保留在当前结构中,它根本不应该是自定义对象,而是Map。 This 是地图对象 - 一个包含 key 和 value 的集合,就像 Realtime Database 中的孩子一样。

如果联赛名称 (=key) 旁边没有 true (=value) - 名称可以存储在 String 变量中,但情况并非如此,因为每个孩子都在Realtime Database 必须有一个值,并且在联赛名称旁边存储一个“虚拟”值会使每个联赛成为Map 的一部分。这个当前的“虚拟”是boolean,这就是为什么这将是联盟的数据类型:Map&lt;String, Boolean&gt; leagues。


第二,你的Season对象: 您在一个季节和多个季节之间感到困惑。您的孩子 - “季节”实际上存储了很多季节。这就是为什么这种情况与上述情况类似——每个季节的时间是key,而季节本身就是value。


因此,User 类的变量应该是:

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

【讨论】:

  • 我已按照您上面的建议对我的 User 类进行了更改,但在尝试访问嵌套数据时仍然收到空对象引用错误。与我在代码中注释“错误”的位置相同,我正在尝试像这样访问它... C.getSeason().getthisSeason_points();
  • 请更新您的代码和问题中的当前数据结构,这样会更容易帮助您。
  • 我已经更新了我的 JSON 和代码以反映我现在拥有的内容。
  • 不幸的是,我不确定如何调整您在此处与我的工作链接的示例,因为我试图将整个 User 对象存储在 ArrayList 中,然后访问单个数据(或键)。
  • 请尝试从对象和数据库中删除(仅用于检查)Season 变量,看看它是否有效。也许这与它有关。另外,请看这篇文章:stackoverflow.com/questions/36475470/nested-lists-in-firebase。这个问题非常像你的问题,并且在那里有效。也许我错过了什么,但我很确定这是正确的方法。
猜你喜欢
  • 1970-01-01
  • 2021-01-08
  • 2017-02-12
  • 1970-01-01
  • 2017-12-22
  • 2018-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多