How to read same value from nodes with different keys in Firebase real-time database?

Viewed 77

So I'm trying to display a list of comments under a post in a RecyclerView. However, I always run into the problem that I can't read the correct value because I don't know how to output the right path when the keys differ.

Can somebody help me?

Here's my structure in Firebase:

enter image description here

Here's my code so far:

 private void loadComments() {
        DatabaseReference commentRef = mRootReference.child("comments").child(pollid).getParent().child("comment");
        Query commentQuery = commentRef.limitToLast(mCurrentPage * TOTAL_ITEMS_TO_LOAD);
        commentQuery.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                for (DataSnapshot ds : dataSnapshot.getChildren()) {
                    Comment comment = ds.getValue(Comment.class);
                    commentList.add(comment);
                    mAdapter.notifyDataSetChanged();
                    mCommentList.scrollToPosition(commentList.size() - 1);
                }
            }

            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {

            }

            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {

            }

            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String s) {

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }
2 Answers

Seeing your database schema and your code, I assume that the pollid variable specified in your reference holds the value of LKwV ... IRyZ. So to display all the comments within this node, please use the following lines of code:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
Query query = rootRef.child("comments").child(pollid).orderByChild("time");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        List<Comment> list = new ArrayList<>();
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            Comment comment = ds.getValue(Comment.class);
            commentList.add(comment);
        }

        //Do what you need to do with your list
        //Pass the list to the adapter and set the adapter
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage());
    }
};
query.addListenerForSingleValueEvent(valueEventListener);

Try using orderByChild() in your query.

Query commentQuery = commentRef.limitToLast(mCurrentPage * TOTAL_ITEMS_TO_LOAD).orderByChild("time");
Related