首页 > 解决方案 > 无法从 Firebase 访问嵌套数据

问题描述

在这种情况下,我正在尝试获取嵌套的 data.comments

在此处输入图像描述

任务类:

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:尝试在空对象引用上调用接口方法“java.util.Set java.util.Map.keySet()”

由于某种原因,列表为空。它没有填充评论对象。

更新

我发现我的代码存在问题。在我的代码中,注释以 HashMap 的形式出现。我真的不关心评论 id。我只想将它们存储为一个列表。但是它们以 hashmap 的形式出现。如何在没有它们的 id 的情况下将它们作为列表检索?(例如 ciid)所以将所有评论作为评论对象存储在一个列表中。这就是我想要做的。我可以轻松地将 hashmap 值转换为列表,但也许还有另一种方法可以做到这一点

标签: javaandroidfirebasefirebase-realtime-database

解决方案


错误信息是:

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

所以你正在调用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
}

推荐阅读