Java 如何查询firebase数据库以返回值';s键';s的父母';谁的父母?

Java 如何查询firebase数据库以返回值';s键';s的父母';谁的父母?,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我正在开发一个团队聊天应用程序。我正在firebase中存储聊天数据 这是我的数据结构 聊天记录存储在名为chats的节点下 chats的每个直接子项都是一个团队的名称(如whatsapp..chat groups) 团队节点包含所有聊天信息。聊天信息被存储 父节点的格式为时间戳\u chat 我的问题 现在,我必须创建一个firebase查询,通过从键获取此团队节点 就是 如果from:字段包含给定搜索值(如“ragesh”),则必须将父节点“team_name”作为数据快照返回(如“te

我正在开发一个团队聊天应用程序。我正在firebase中存储聊天数据

这是我的数据结构

  • 聊天记录存储在名为
    chats
    的节点下
  • chats
    的每个直接子项都是一个团队的名称(如whatsapp..chat groups)
  • 团队
    节点包含所有聊天信息。聊天信息被存储
  • 父节点的格式为
    时间戳\u chat
我的问题

现在,我必须创建一个firebase查询,通过从键获取此团队节点

就是 如果
from:
字段包含给定搜索值(如“ragesh”),则必须将父节点“team_name”作为数据快照返回(如“teamrova”)

简单地说,我想要在
from
字段中具有特定用户名的团队的datasnapshot

我的工作


我尝试了以下代码:

  reference1 = FirebaseDatabase.getInstance().getReference().child("chats");

    Query chatQuery = reference1.orderByChild("from").equalTo("ragesh");
    System.out.println("Chat list :: starting");

    chatQuery.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            System.out.println("Chat list :: onChildAdded");

            for (DataSnapshot chat : dataSnapshot.getChildren()) {

                HashMap<String, Object> hashMap = (HashMap<String, Object>) dataSnapshot.getValue();
                System.out.println("Chat list :: The chat group is =>" + dataSnapshot.getKey());
                System.out.println("Chat list :: The key & Value => " + chat.getKey() +" :: "+chat.getValue().toString());

            }
        }

        @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) {
            Toast.makeText(ChatListActivity.this, "Connection Error "+databaseError.getDetails(), Toast.LENGTH_SHORT).show();
            System.out.println("Chat list :: databaseError "+databaseError.toString());


        }
    }); 
reference1=FirebaseDatabase.getInstance().getReference().child(“聊天”);
Query chatQuery=reference1.orderByChild(“from”).equalTo(“ragesh”);
System.out.println(“聊天列表::启动”);
addChildEventListener(新的ChildEventListener(){
@凌驾
公共void onChildAdded(DataSnapshot DataSnapshot,字符串s){
System.out.println(“聊天列表::onchildaded”);
for(DataSnapshot聊天:DataSnapshot.getChildren()){
HashMap HashMap=(HashMap)dataSnapshot.getValue();
System.out.println(“聊天列表::聊天组为=>”+dataSnapshot.getKey());
System.out.println(“Chat list::The key&Value=>”+Chat.getKey()+“:”+Chat.getValue().toString());
}
}
@凌驾
公共void onChildChanged(DataSnapshot DataSnapshot,字符串s){
}
@凌驾
ChildRemoved上的公共void(DataSnapshot DataSnapshot){
}
@凌驾
已移动ChildMoved上的公共void(DataSnapshot DataSnapshot,字符串s){
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
Toast.makeText(ChatListActivity.this,“连接错误”+databaseError.getDetails(),Toast.LENGTH\u SHORT.show();
System.out.println(“聊天列表::databaseError”+databaseError.toString());
}
}); 
遗憾的是,上面的代码没有返回任何值。即使是
System.out.println(“聊天列表::onchildaded”)未调用。而且
也不会取消调用(因此,没有错误)

我被这个吓坏了。请帮帮我

要获取用户名:

mRootRef.child("chats").child("teamrova").orderByChild("from").equalTo("ragesh").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
   for(DataSnapshot datas: dataSnapshot.getChildren()){
     String name=datas.child("from").getValue().toString();



}

@Override
public void onCancelled(DatabaseError databaseError) {

   }
});
由于您使用的是
addChildeventListener
,因此不需要for循环就可以为(DataSnapshot chat:DataSnapshot.getChildren())获取这些值
{

您还需要更改以下内容:

 reference1 = FirebaseDatabase.getInstance().getReference().child("chats");
为此:

reference1 = FirebaseDatabase.getInstance().getReference().child("chats").child("teamrova");
上述代码是另一种选择,可使用
addValueEventListener

获取用户名:

mRootRef.child("chats").child("teamrova").orderByChild("from").equalTo("ragesh").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
   for(DataSnapshot datas: dataSnapshot.getChildren()){
     String name=datas.child("from").getValue().toString();



}

@Override
public void onCancelled(DatabaseError databaseError) {

   }
});
由于您使用的是
addChildeventListener
,因此不需要for循环就可以为(DataSnapshot chat:DataSnapshot.getChildren())获取这些值
{

您还需要更改以下内容:

 reference1 = FirebaseDatabase.getInstance().getReference().child("chats");
为此:

reference1 = FirebaseDatabase.getInstance().getReference().child("chats").child("teamrova");

上面的代码是
addValueEventListener

的另一种选择,因为这里的用例是搜索,所以最好使用SingleValueEvent只获取一次数据,避免搜索结果中的更改。但是如果我不知道团队名称?@PeterHaddad,我想检索团队名称,所以我不能在程序中硬编码
teamrova
am.@LordCommander好的,如果快照处于“聊天”状态,而您不知道团队名称,则需要迭代两次,但orderbychild(..)不起作用。因为orderbychild命令的是直接child@PeterHaddad…请给出代码好吗?。请..我是firebase的新手。因为这里的用例是搜索,所以最好使用SingleValueEvent只获取一次数据,避免搜索结果中的更改。但是如果我不知道团队名称?@PeterHaddad我想检索团队名称,因此无法在程序中硬编码
teamrova
。@好的,如果快照在
chats
上,而您不知道团队名称,则需要迭代两次,但orderbychild(..)不起作用。因为orderbychild命令的是直接child@PeterHaddad…请你给我这个的代码好吗?.请..我是firebase的新手。