Не может получить доступ к вложенным данным из Firebase - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь получить вложенные данные в этом случае

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: попытка вызвать метод интерфейса 'java.util.Set java.util.Map.keySet ()' для пустой ссылки на объект

По какой-то причине List имеет значение null. Он не заполнен объектами комментариев.

UPDATE

Я обнаружил проблему с моим кодом. В моем коде комментарии появляются как HashMap. Я действительно не забочусь о комментариях id. Я просто хочу сохранить их как List.But, они приходят как hashmap. Как получить их в виде списка без их идентификаторов? (например, cid) Так что все комментарии хранятся в виде объекта комментария внутри списка. Это то, что я пытаюсь сделать. Я могу легко конвертировать значения hashmap в список, но, возможно, есть другой способ сделать это

Ответы [ 3 ]

0 голосов
/ 04 мая 2018

Сообщение об ошибке:

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
}
0 голосов
/ 07 мая 2018

Чтобы получить это значение, используйте следующий код:

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

Выход будет:

  //blank String
  //blank String
0
0 голосов
/ 04 мая 2018

Попробуйте этот код ..

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


                for (DataSnapshot childSnapshot : dataSnapshot.getChildren()) {
                    Mission mission = childSnapshot.getValue(Mission.class);
                    if (mission != null && !mission.getComment().isEmpty()) {
                        for (Comment comment : mission.getComment()) {
                            Log.d("comment", comment.getBody());
                        }
                    }
                }

            }

        }


        @Override
        public void onCancelled(DatabaseError databaseError) {


        }


    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...