Firebase: дочерний прослушиватель событий, кажется, перезагружает все данные по каждому добавленному дочернему элементу - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть узел базы данных с именем posts, выглядит так:

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

post 1,2,3 - push-идентификаторы.В основном это узел, который хранит записи в виде push-идентификаторов, что означает, что они автоматически добавляются сверху вниз, причем снизу - новые добавленные сообщения.

Чтобы прослушать этот узел, я подключил дочерний слушатель событий, чтобы получить всесообщения, когда я получаю сообщения, я сохраняю их в объекте списка (массив).Теперь, чтобы отслеживать размер списка, я добавил запись в журнал.например:

       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 голосов
/ 26 апреля 2018

Вы только получаете 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

0 голосов
/ 26 апреля 2018

Поскольку вы использовали limitToLast(), вы получаете эту проблему.

Она используется для set a maximum number of children, чтобы бытьсинхронизируется для данного обратного вызова.

Если вы установите ограничение в 25, первоначально вы будете получать только до 25 событий child_added.

Однако, если у вас более 25 сообщений, вы получите событие child_added только для последних 25 заказанных сообщений.При изменении элементов вы будете получать события child_removed для каждого элемента, выпадающего из активного списка, так что the total number stays at 25.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...