繁体   English   中英

Firebase DataSnapshot,无法检索正确的子项列表

[英]Firebase DataSnapshot, Can't retrieve the right list of children

我有一个用于聊天应用程序的数据库结构,所以我在数据库中有一个消息节点,如下所示在此处输入图片说明

消息是一个键的父键,它包含两个聊天用户的 UID,这个键包含聊天正文的值,到目前为止,我的应用程序在按我想要的方式推送数据时工作得很好。

但是当试图读取数据时,DataSnapShot 对象总是具有节点的最后一片叶子,即键的子节点。 我尝试了不同的方法来获取它自己迭代的密钥,并在没有运气的情况下获得它的值列表。

我试过的方法

  public static final String MESSAGES_NODE_DB = "messages"; 
  mMessageDbRef = FirebaseDatabase.getInstance().getReference()
                    .child(MESSAGES_NODE_DB).child(keyUserA + "-" + KeyUserB);
    
     mMessageDbRef.addChildEventListener(new ChildEventListener() {
                @Override
                public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                    Timber.d("parent key " + dataSnapshot.getKey());
    
                    for (DataSnapshot singleSnap : dataSnapshot.getChildren()) {
                            Message message = singleSnap.getValue(Message.class);
                            messageList.add(message);
                            instantiateRecyclerView();
                    }
                }

这种方法总是会导致错误 Can't convert object of type

字符串

并且父密钥打印 L91eMRVq_nx6WHUzZFo

另一个

    mMessageDbRef = FirebaseDatabase.getInstance().getReference().child("messages");
for (DataSnapshot singleSnap : dataSnapshot.getChildren()) {
                Timber.d("keys" + singleSnap.getKey());
            }
        }

输出为 L91eMRVq_nx6WHUzZFo

我想要达到的目标

检索消息节点内的键列表为

vXgRtbjqhUYPOLyjhmGKRzITUC83-24L0kQx75fhoz06YpXnWRheETct2

在 onChildAdded 方法内部不使用 getChildren() 和 for 循环方法,因为 onChildAdded 方法返回 mMessageDbRef 引用下方的各个节点。 基本上 onChildAdded 中的数据快照参数可以直接转换为 Message 对象。

因此,直接将数据快照值分配给消息对象,就像您所做的那样,无需使用任何循环或 getChildren 方法。

通过这样做,您将可以通过消息对象变量访问消息的值。

像这样的东西:

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

                        Message message = dataSnapshot.getValue(Message.class);
                        messageList.add(message);
                        instantiateRecyclerView();
                }
            }

要检索messages节点内的密钥:

DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("messages").child(keyUserA + "-" + KeyUserB);

reference.addListenerForSingleValueEvent(new ValueEventListener() {
 @Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot datas: dataSnapshot.getChildren()){
   String keys=datas.getKey();
    }
 }
 @Override
public void onCancelled(DatabaseError databaseError) {
   }
 });

数据快照位于child(keyUserA + "-" + KeyUserB); 然后您在 randomid L91eMRVq_nx6WHUzZFo迭代,您将能够使用getKey()检索它

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM