【问题标题】:How to query firebase database to return a value's key's parent's parent?如何查询firebase数据库以返回值的键的父级?
【发布时间】:2018-08-29 05:32:12
【问题描述】:

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

这是我的数据结构

  • 聊天存储在名为chats 的节点下。
  • chats 的每个直系子级都是团队的名称(如 whatsapp.. 聊天组)。
  • team 节点拥有所有聊天消息。聊天消息被存储
  • 具有timestamp_chat 格式的父节点

我的问题

现在我必须创建一个 firebase 查询来通过 key 获取这个团队节点。

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

简单地说,我想要在 from 字段中具有特定用户名的团队的数据快照。

我的工作


我尝试了以下代码:

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


        }
    }); 

遗憾的是,上面的代码没有返回任何值。甚至没有调用
System.out.println("Chat list :: onChildAdded");。而且它 也不会调用 onCancelled。(所以,没有错误)。

我对此感到震惊。请帮我。

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:

    获取用户名:

    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 循环即可获得这些值 for (DataSnapshot chat : dataSnapshot.getChildren()) {

    你还需要改变这个:

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

    到这里:

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

    上面的代码是addValueEventListener的替代代码

    【讨论】:

    • 由于这里的用例是搜索,所以最好使用 SingleValueEvent 只获取一次数据,避免搜索结果发生变化。
    • 但是如果我不知道团队名称?
    • @PeterHaddad 我想检索团队名称,所以我无法在程序中对teamrova 进行硬编码。
    • @LordCommander 好的,如果快照在chats 上并且您不知道团队名称,那么您需要迭代两次但 orderbychild(..) 将不起作用。由于 orderbychild 正在订购直接孩子下的孩子
    • @PeterHaddad ...请您为此提供代码吗?...请..我是firebase的新手。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多