从FireBase检索特定数据(Android) [英] Retrieving Specific Data from FireBase (Android)

查看:154
本文介绍了从FireBase检索特定数据(Android)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在制作一个聊天应用程序,而且我拥有一个包含以下结构的Firebase。聊天1,聊天2,聊天3 ...用于保存不同聊天群组的数据。 Message1,Message2,Message3是第一组中的消息,它可以来自任何作者。

聊天


  • 聊天1

    • Message1

      • Author1

      • MessageText

      b
    • Message2

      • Author2

      • MessageText


    • Message3

      • Author1

      • MessageText


    • $ b
    • Chat2

      • 消息1

        • Author3

        • MessageText


      • 消息2

        • Author1

        • MessageText



        • Chat3



        我想从作者1中检索所有消息的列表。含义Message1,Message3应该从Chat1中检索,而Message3也应该从Chat2中检索。我想显示来自1位作者的所有消息。

          ref = new Firebase(FIREBASE_URL); //根URL 

        ref.addValueEventListener(新ValueEventListener(){

        @覆盖
        公共无效onDataChange(DataSnapshot dataSnapshot){
        为(DataSnapshot child:dataSnapshot.getChildren()){
        for(DataSnapshot childd:child.getChildren()){
        //这可以工作,但它会检索所有的数据
        }
        }
        }

        @Override
        public void onCancelled(){
        $ b}
        });

        这给了我所有的数据!如何将其限制为Author1? Firebase会一直检索您要求的完整节点。既然你一次要求所有的聊天或一个聊天(不知道你从你的代码中做了哪一个),这就是你得到的。



        如果您希望从Firebase获取更少的数据,但您必须更具体地了解您的要求。例如,如果你想显示Chat1,那么从侦听Chat1节点的 开始。



        这段代码来自 Android版Firebase指南

          //在添加到Firebase时检索新帖子
        ref.addChildEventListener(new ChildEventListener(){
        //在添加到Firebase时检索新帖子
        @倍率
        公共无效onChildAdded(DataSnapshot快照,字符串previousChildKey){
        地图<字符串,对象> newPost =(地图<字符串,对象>)snapshot.getValue();
        的System.out。 (标题);
        } $ b $( b // ... ChildEventListener还定义了onChildChanged,onChildRemoved,
        // onChildMoved和onCanceled,在后面的章节中将会讨论
        });

        这段代码和当前的例子完全一样,但是代码循环而不是数据 for ,Firebase一次为您提供一条消息。



        有了这个功能,您可以过滤消息。这是一个两步的过程:首先你通过一个子节点进行排序,然后限制哪些节点返回。

         查询查询= ref.orderByChild(Author)。equalTo(Author1,Author); 
        query.addChildEventListener(new ChildEventListener(){
        //其余的代码仍然与上面相同

        最后一点最好在 Firebase文档在查询


        I am making a chat app, and I have a Firebase with following Structure. Chat1,Chat2,Chat3... is used for saving data of different Chat groups. Message1,Message2,Message3 are Messages inside 1st group., It can be from any author.

        Chats

        • Chat1
          • Message1
            • Author1
            • MessageText
          • Message2
            • Author2
            • MessageText
          • Message3
            • Author1
            • MessageText
        • Chat2
          • Message1
            • Author3
            • MessageText
          • Message2
            • Author4
            • MessageText
          • Message3
            • Author1
            • MessageText
        • Chat3

        I want to retrieve the list of all Messages from "Author 1". Meaning Message1,Message3 should be retrieved from Chat1 and Message3 also should get retrieved from Chat2. I want to display all messages from 1 author.

        ref = new Firebase(FIREBASE_URL); //Root URL
        
        ref.addValueEventListener(new ValueEventListener() {
        
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                 for (DataSnapshot child : dataSnapshot.getChildren()) {
                         for (DataSnapshot childd : child.getChildren()) {
                             //This might work but it retrieves all the data
                            }
                        }
            }
        
            @Override
            public void onCancelled() {
        
            }
        });
        

        This Gives me entire data! How do I restrict it to "Author1"?

        解决方案

        Firebase will always retrieve the complete node(s) that you ask for. Since you're asking for all Chats or an entire Chat at once (it isn't clear which one you do from your code), that's what you get.

        If you want to get less data from Firebase, you'll have to be more specific in what you ask from it. For example if you want to display Chat1, then start by listening for the children of the Chat1 node.

        This snippet comes from the Firebase guide for Android:

        // Retrieve new posts as they are added to Firebase
        ref.addChildEventListener(new ChildEventListener() {
            // Retrieve new posts as they are added to Firebase
            @Override
            public void onChildAdded(DataSnapshot snapshot, String previousChildKey) {
                Map<String, Object> newPost = (Map<String, Object>) snapshot.getValue();
                System.out.println("Author: " + newPost.get("author"));
                System.out.println("Title: " + newPost.get("title"));
            }
            //... ChildEventListener also defines onChildChanged, onChildRemoved,
            //    onChildMoved and onCanceled, covered in later sections.
        });
        

        This snippet accomplishes the same as your current example, but instead of your code looping over the data with a for, Firebase feeds you the data one message at a time.

        With that in place, you can filter the messages. This is a two-step process: first you order by a child node, then you limit which nodes are returned.

        Query query = ref.orderByChild("Author").equalTo("Author1", "Author");
        query.addChildEventListener(new ChildEventListener() {
            // the rest of the code remains the same as above
        

        This last bit is best explained in the Firebase documentation on queries.

        这篇关于从FireBase检索特定数据(Android)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆