【问题标题】:How to read same value from nodes with different keys in Firebase real-time database?如何从 Firebase 实时数据库中具有不同键的节点读取相同的值?
【发布时间】:2019-02-03 16:20:56
【问题描述】:

所以我试图在RecyclerView 的帖子下显示 cmets 列表。但是,我总是遇到无法读取正确值的问题,因为我不知道当键不同时如何输出正确的路径。

有人可以帮助我吗?

这是我在 Firebase 中的结构:

到目前为止,这是我的代码:

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

            }
        });
    }

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:

    尝试在查询中使用 orderByChild()。

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

    【讨论】:

    • 你能再解释一下吗?只是添加它,对我不起作用。
    • 你要分页吗?
    • 我正打算这样做...但我忘记在上传之前删除这部分代码
    • 也许这个链接可以帮助你stackoverflow.com/questions/37711220/…
    • 分页解决了我的问题...我努力阅读蓝色标记的值
    【解决方案2】:

    查看您的数据库架构和代码,我假设您的引用中指定的pollid 变量包含LKwV ... IRyZ 的值。因此,要显示该节点内的所有 cmets,请使用以下代码行:

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

    【讨论】:

    • 谢谢,完美运行!...但我也发现,我在模型课上犯了一个错误。显然,我的模型中的变量必须与我的数据库中的节点具有相同的名称。你能确认一下吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-27
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    • 2021-01-25
    • 2020-04-23
    • 1970-01-01
    相关资源
    最近更新 更多