【问题标题】:Firebase Query limitToLast doesn't work as expectedFirebase 查询 limitToLast 无法按预期工作
【发布时间】:2019-01-10 18:28:47
【问题描述】:

在我的 Firebase 数据库中,有一些值存储在推送键下,我试图通过它们的键检索这些值,从 其中的最后 10 个开始。 问题是它不是从最后 10 位的键开始而是从特定键开始那个键是这段代码第一次初始化的那个,它应该是最后 10 个中的第一个。但是添加了新数据,并且即使在重新安装、重新启动应用程序之后,它也会忽略它。 如果我将数字更改为其他数字,那么它可以正常工作,直到我将新消息添加到数据库。然后同样的事情发生在那个号码上。

注意:已经传递给conversationRef的ConversationPushID(string)是正确的,数据结构是正确的,只是为了安心分享而已,我检查了。

查询代码:

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

【问题讨论】:

  • 如果您的conversationsRef 没有任何问题,那么这很难说,实际上出了什么问题。
  • @PradyumanDixit 它是在函数本地范围内的 Query 之前声明的。我在问题中添加了更多细节,也许它会有所帮助。
  • 我不认为另一个查询会干扰它,除非它们同时触发,这不应该发生。
  • @Shehroz 我知道,但这不是它的目的。我在启动应用程序时再次调用它,因此添加后数据已经存在。

标签: android firebase firebase-realtime-database


【解决方案1】:

启用 Firebase 离线功能时会出现此问题。

FirebaseDatabase.getInstance().setPersistenceEnabled(true);

解决它保持您正在查询的 DatabaseReference 同步,如下所示:

  conversationsRef.keepSynced(true);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    • 2017-02-09
    • 2016-10-14
    • 2017-09-19
    相关资源
    最近更新 更多