Запрос Firebase limitToLast не работает должным образом - PullRequest
0 голосов
/ 08 ноября 2018

В моей базе данных Firebase есть значения, хранящиеся под кнопками, и я пытаюсь получить эти значения по их ключам, начиная с последних 10 из них . Проблема в том, что начинается не с клавиши на последней 10-й позиции , а с определенной клавиши . Этот ключ тот, который этот код был впервые инициализирован, и он был первым из последних 10-го, как и должно быть. Но новые данные были добавлены и игнорирует их даже после переустановки, перезапуска приложения. Если я изменю число на что-то другое, то оно будет работать нормально, пока я не добавлю новое сообщение в базу данных. Затем то же самое происходит с этим номером.

Примечание: ConversationPushID (строка), который был передан в диалоги откликов, правильный и структура данных верна, просто поделился ими для подтверждения, я проверил это.

Код запроса:

 final  DatabaseReference conversationsRef = firebaseInstance.rootRef
                        .child(mContext.getString(R.string.dbname_conversations))
                        .child(ConversationPushID);

Query getLastMessagesQuery = conversationsRef.orderByKey().limitToLast(10);

                        getLastMessagesQuery.addListenerForSingleValueEvent(new ValueEventListener()
                            {
                                @Override
                                public void onDataChange(@NonNull DataSnapshot snap)
                                    {

                                        for (DataSnapshot dataSnapshot : snap.getChildren())
                                            {
                                                Message message = dataSnapshot.getValue(Message.class);

                                                String messageKey = dataSnapshot.getKey();
                                                messageList.add(message);

                                            }         
                                        getLastMessageFromListener = false;
                                        setListenerForLastMessage();                                        
                                    }

                                @Override
                                public void onCancelled(@NonNull DatabaseError databaseError)
                                    {

                                    }
                            });

Дополнительная информация (есть другой запрос, назначаемый сразу после этого, пишущий на случай, если есть соединение. Потому что эта ошибка вообще не имеет смысла

private void setListenerForLastMessage()
            {

              final  DatabaseReference conversationsRef = firebaseInstance.rootRef
                        .child(mContext.getString(R.string.dbname_conversations))
                        .child(ConversationPushID);


                getLastMessageQuery = conversationsRef.orderByKey().limitToLast(1);
                lastMessageListener = new ChildEventListener()
                    {
                        @Override
                        public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s)
                            {
                                Message message = dataSnapshot.getValue(Message.class);

                                if (getLastMessageFromListener)
                                    {
                                        messageList.add(message);

                                    }
                                getLastMessageFromListener = true;
                            }
                        @Override
                        public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s)
                            {
                            }
                        @Override
                        public void onChildRemoved(@NonNull DataSnapshot dataSnapshot)
                            {
                            }
                        @Override
                        public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s)
                            {
                            }
                        @Override
                        public void onCancelled(@NonNull DatabaseError databaseError)
                            {
                            }
                    };
                getLastMessageQuery.addChildEventListener(lastMessageListener);
            }

Data Structure

1 Ответ

0 голосов
/ 08 ноября 2018

Эта проблема возникает, когда включены возможности автономной работы Firebase.

FirebaseDatabase.getInstance().setPersistenceEnabled(true);

Чтобы решить эту проблему сохранить опцию DatabaseReference, которую вы запрашиваете синхронизирована , например:

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