Firebase:子事件监听器似乎重新加载每个添加的孩子的所有数据

时间:2018-04-26 04:14:38

标签: android firebase firebase-realtime-database

我有一个名为posts的数据库节点,如下所示:

      posts
      |
      |---post1
      |
      |---post2
      |
      |---post3

帖子1,2,3是push id。它基本上是一个节点,将帖子存储为推送ID,这意味着它们会自动从上到下添加,最下面是新添加的帖子。

要收听此节点,我附加了一个子事件监听器以获取所有帖子,当我收到帖子时,我将它们存储在List对象(数组)中。现在为了跟踪列表的大小,我添加了一个日志语句。像这样:

       private void getPosts(){

        DatabaseReference post_ref = FirebaseDatabase.getInstance().getReference().child("posts");

        Query query = post_ref.orderByKey().limitToLast(25);

        ChildEventListener listener = new ChildEventListener(){

        @Override
        public void onChildAdded(DataSnapshot datasnapshot , String s){

          //get posts
          Post post = datasnapshot.getValue(Post.class);

          //add to list

           post_list.add(post);

          //log the size of post_list

           Log.e("SIZE" , String.valueOf(post_list.size()));




        } 



        };

        query.addChildEventListener(listener); 

       } 

执行此操作后,日志会打印一个以1开头并以25结尾的数字列表。这表示子事件侦听器被调用了25次,25个对象被添加到列表中。

直到这里都有意义。

问题

我调用getPosts()方法后。我在数据库中添加了一个新帖子,并且控制台打印了25,这意味着大小仍然是25.但我刚添加了一个新帖子,这意味着它应该已添加到列表中。

我应该将26作为新尺寸,为什么它仍然是25

另外,当我添加另一个帖子时,post_list的大小仍会记录25。有人可以解释一下吗?

2 个答案:

答案 0 :(得分:1)

你只收到25件物品,因为你设置了
 Query query = post_ref.orderByKey().limitToLast(25);

请阅读Google Firebase文档

The limitToLast() method is used to set a maximum number of children to be synced for a given callback. If we set a limit of 100, we will initially only receive up to 100 child_added events. If we have fewer than 100 messages stored in our Database, a child_added event will fire for each message. However, if we have over 100 messages, we will only receive a child_added event for the last 100 ordered messages. As items change, we will receive child_removed events for each item that drops out of the active list so that the total number stays at 100.

这是链接https://firebase.google.com/docs/reference/js/firebase.database.Query

答案 1 :(得分:0)

由于您使用了 limitToLast() ,因此您遇到了此问题。

用于 set a maximum number of children 的同步回拨。

如果您将限制设置为25,则最初最多只能收到25个child_added事件。

但是,如果您有超过25条消息,则只会收到最近25条有序消息的child_added事件。随着项目的更改,您将收到退出活动列表的每个项目的child_removed事件,以便 the total number stays at 25.