无法从Firebase访问嵌套数据

时间:2018-05-04 12:08:46

标签: java android firebase firebase-realtime-database

我想在这种情况下获得嵌套的data.comments

enter image description here

任务等级:

public class Mission implements Serializable {

    private String body;
    private String name;
    private Integer vote;
    private List<Comment> comments;
    private int completedby;
    Mission() {
    }

    public String getBody() {
        return body;
    }

    public int getCompletedby() {
        return completedby;
    }

    public String getName() {
        return name;
    }

    public Integer getVote() {
        return vote;
    }

    public List<Comment> getComment() {
        return comments;
    }
}   

评论类:

public class Comment {
    private String body;
    private String username;
    private int vote;

    public Comment(){}

    public String getBody() {
        return body;
    }

    public String getUsername() {
        return username;
    }

    public int getVote() {
        return vote;
    }
}

这是我检索数据的方式。我无法访问评论体。我可以顺便访问任务属性。(评论列表除外)

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


        for (DataSnapshot childSnapshot : dataSnapshot.getChildren()) {
            missionMap.put(childSnapshot.getKey(),childSnapshot.getValue(Mission.class));

        }
        Log.d("working",missionMap.get(missionMap.keySet().toArray()[0]).getBody()); // working 

Log.d("comment",missionMap.get(missionMap.keySet().toArray()[0]).getComment().get(0).getBody()); // not working
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
    }
});

抛出的错误是。

  

java.lang.NullPointerException:尝试调用接口方法   'null对象引用上的'java.util.Set java.util.Map.keySet()'

由于某种原因,List为null。它没有填充注释对象。

更新

我发现我的代码存在问题。在我的代码中,评论将作为HashMap发布。我真的不关心评论id。我只想将它们存储为List.But它们将作为hashmap出现。如何将它们作为列表检索而没有它们的ID? (例如ciid)所以将所有注释作为注释对象存储在列表中。说明我想要做什么。我可以将hashmap值转换为容易列表,但也许有另一种方法可以做到这一点

3 个答案:

答案 0 :(得分:0)

试试这段代码..

eval

答案 1 :(得分:0)

错误消息是:

  

java.util.Set java.util.Map.keySet():尝试调用接口方法&#39; null&#39;在Map.keySet()对象引用

所以你在非初始化对象上调用missionMap.keySet()

您共享的代码中执行此调用的唯一位置如下所示:

missionMap

所以你似乎永远不会初始化onDataChange()。最简单的解决方法是在public void onDataChange(DataSnapshot dataSnapshot) { Map<String, Mission> missionMap = new HashMap<>(); for (DataSnapshot childSnapshot : dataSnapshot.getChildren()) { missionMap.put(childSnapshot.getKey(),childSnapshot.getValue(Mission.class)); } Log.d("working",missionMap.get(missionMap.keySet().toArray()[0]).getBody()); // working Log.d("comment",missionMap.get(missionMap.keySet().toArray()[0]).getComment().get(0).getBody()); // not working }

中创建地图
CMAKE_PREFIX_PATH

答案 2 :(得分:0)

要获得这些价值,请使用以下代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference ciidRef = rootRef.child("id").child("missions").child("comments").child("ciid");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        String body = dataSnapshot.child("body").getValue(String.class);
        String username = dataSnapshot.child("username").getValue(String.class);
        long vote = dataSnapshot.child("vote").getValue(Long.class);
        Log.d("TAG", body + " / " + username + " / " + vote);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
ciidRef.addListenerForSingleValueEvent(valueEventListener);

theutut将是:

  //blank String
  //blank String
0