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

问题描述:

这是我在firebase中的数据库结构。如何访问嵌入在Firebase数据库中的子节点内的子节点?

enter image description here

我要访问的消息下的child.I消息内容可以得到数孩子消息的孩子,但不能检索每个孩子的价值。

ref2指向我的firebase实例。
我必须从particulat聊天室获取所有消息。

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

       } 
      }); 
+0

发布您的代码请 –

+0

代码更新。 –

+0

您正在使用错误的参考。检查答案。 –

如果你想得到消息的孩子,我们需要像这样遍历。

'Kd4TN8fuda6CArtAUo0' - > '消息' - > '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

+0

的值为空。 –

+0

你是否检查过我的答案中的链接,它是由FireBase团队检查的。 –

+0

是的,我在这里使用相同的查询。 –

您[R问题就在这里:

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

你正在寻找一个叫做messagemessages节点,它不存在。

您应该首先参考messages节点,然后遍历所有孩子。

首先appoach是使用方法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对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 
    //.... 

} 
+0

我试过了这两个,但没有帮助。我的ref refrence是这个 ref2 = mDatabase1.child(“chatrooms”)。orderByChild(“roomName”)。equalTo(“s”); –

+0

@GyanendraMani你的参考应该是聊天室内的消息nome。 –

+0

这样的事情: DatabaseReference df = mDatabase.child(“Kd4TN8fuda6CArtAUo0”)。child(“messages”); df.addListenerForSingleValueEvent(新ValueEventListener(){} 其中 mdatabse指向mDatabase = FirebaseDatabase.getInstance()getReference( “聊天室”);。 –

我有更多的答案很简单:

您尝试访问消息像其他节点像chatpic,所有者等... // Ur Databas Ë引用父节点,当你企图为孩子使用下面的代码来访问消息:

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

         }