如何访问嵌套在Firebase数据库中子节点内的子节点?

时间:2017-02-16 07:56:21

标签: android firebase firebase-realtime-database

这是我在firebase中的数据库结构。

enter image description here

我想访问消息child下的消息内容。我可以获取子节点的子节点数,但无法检索每个子节点的值。

ref2指向我的firebase实例 我必须得到来自特定聊天室的所有消息。

     ref2.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for (DataSnapshot childDataSnapshot : dataSnapshot.getChildren()) {
                        listText.add(childDataSnapshot.child("messages").child("message").getValue() + "");
                        listText.add(childDataSnapshot.child("messages").child("name").getValue() + "");
                        //   userArrayList.add(new User("" + childDataSnapshot.child("username").getValue(), "" + childDataSnapshot.child("profileURL").getValue(), ""));
                        Log.v("messag_ids", "" + childDataSnapshot.child("messages").child("Kd4TQPrAWsNY1vcid1P").child("message")); //displays the key for the node

                    }
                    lvChat.setAdapter(new ChatAdapter(ChatActivity.this, listUsername, listText));
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });

3 个答案:

答案 0 :(得分:0)

如果你想让消息成为子消息,我们需要像这样遍历。

  

'Kd4TN8fuda6CArtAUo0' - > 'messages' - > 'Kd4TQPrAWsNY1vcid1P' - > '消息'

试试这个:

<yourref>.child('Kd4TN8fuda6CArtAUo0').child('messages').child('Kd4TQPrAWsNY1vcid1P').child('message')

enter image description here

请参阅FireBase团队的此链接:Common SQL Queries converted for the Firebase Database - The Firebase Database For SQL Developers #4

答案 1 :(得分:0)

您的问题在这里:

childDataSnapshot.child("messages").child("message")

您正在寻找message 中名为messages的节点,但该节点并不存在。

首先应该有messages节点的引用,然后遍历所有子节点。

第一个方法是使用DataSnapshot的方法来遍历孩子 并访问值使用:

ref2.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
              for (DataSnapshot childDataSnapshot : dataSnapshot.getChildren()) {

                  String name = (String) childDataSnapshot.child("name").getValue();
                  //Do the same for other properties.

               }
               //......
     }
     //..
}

否则第二种方法是使用内置的JSON-to-POJO串行器/解串器。
您可以使用Message.class然后使用

ref2.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot messageSnapshot: dataSnapshot.getChildren()) {
                Message message = messageSnapshot.getValue(Message.class);
            }
        }
   //..
}

您的Message课程应该是这样的:

public class Message {

   String name;
   String message;
   String chatroom;

   public Message(){
     //default constructor
   }

   //Getters and setters
   //....

}

答案 2 :(得分:0)

我有更简单的答案:

您将尝试像其他节点一样访问消息节点,例如chatpic ,所有者等...  // Ur数据库引用是父节点,当您尝试访问消息时,子节点使用以下代码:

for(DataSnapshot dataSnapshot1:mainSnapShot.child("message").getChildren()){                          

                            Map<?, ?> valuex = (Map<?, ?>) dataSnapshot1.getValue();


                            if (!TextUtils.isEmpty(valuex.get("message").toString())) {
                                Log.i("message",valuex.get("message").toString());
                            }



                            if (!TextUtils.isEmpty(valuex.get("name").toString())) {
                                Log.i("name",valuex.get("name").toString());
                            }

                        }