当前位置: 首页 > 知识库问答 >
问题:

addSnapshotListener再次获取所有数据,而不是仅有的更改

蒋茂材
2023-03-14

我正在尝试制作聊天应用程序,但我有一个问题,获取实时更改,我尝试使用文档并成功地进行了分页,但当我调用addSnapshotListener时,我再次获得了所有文档,不仅是更改,而且当我尝试检查我获得的数据是否被收获时,应用程序崩溃了!我也试图使它在列表的开始,所以任何一个可以帮助我什么是错误的代码!!

从FireStore获取所有列表:

 private void getList() {
    String myId = mAuth.getUid();
    String id = getIntent().getStringExtra("id");
    messageItems = new ArrayList<>();

    Query first = db.collection("ChatUsers")
            .document(myId)
            .collection(id)
            .orderBy("time", Query.Direction.DESCENDING)
            .limit(10);
    first.get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
        @Override
        public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
            for (QueryDocumentSnapshot documentSnapshot : queryDocumentSnapshots){
                String name = documentSnapshot.get("name").toString();
                String message = documentSnapshot.get("message").toString();
                String messageId = documentSnapshot.getId();
                String userId = documentSnapshot.get("userId").toString();
                Long timee = (Long) documentSnapshot.get("time");
                MessageItem messageItem = new MessageItem(message,messageId,name,userId,timee);

                messageItems.add(messageItem);
                adapter.notifyDataSetChanged();
            }

            if (queryDocumentSnapshots.size() >= 10) {
                lastVisible = queryDocumentSnapshots.getDocuments()
                        .get(queryDocumentSnapshots.size() -1);
                Query next = db.collection("ChatUsers")
                        .document(myId)
                        .collection(id)
                        .orderBy("time", Query.Direction.DESCENDING)
                        .startAfter(lastVisible)
                        .limit(10);
                next.get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
                    @Override
                    public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                        for (QueryDocumentSnapshot documentSnapshot : queryDocumentSnapshots){
                            String name = documentSnapshot.get("name").toString();
                            String message = documentSnapshot.get("message").toString();
                            String messageId = documentSnapshot.getId();
                            String userId = documentSnapshot.get("userId").toString();
                            Long timee = (Long) documentSnapshot.get("time");
                            MessageItem messageItem = new MessageItem(message,messageId,name,userId,timee);

                            messageItems.add(messageItem);
                        }
                        addOnChangeListener(messageItems,id,myId);
                        lastVisible = queryDocumentSnapshots.getDocuments()
                                .get(queryDocumentSnapshots.size() -1);

                    }
                });
            }

        }
    });

}

以下是我从ChangeListener获得的信息:

private void addOnChangeListener(List<MessageItem> messageItems, String id, String myId) {
    if (messageItems.size()>0){
        db.collection("ChatUsers")
                .document(myId)
                .collection(id)
                .orderBy("time", Query.Direction.ASCENDING)
                .addSnapshotListener(new EventListener<QuerySnapshot>() {
                    @Override
                    public void onEvent(@Nullable QuerySnapshot value, @Nullable FirebaseFirestoreException error) {
                        for (DocumentChange dc : value.getDocumentChanges()){
                            String name = dc.getDocument().get("name").toString();
                            String message = dc.getDocument().get("message").toString();
                            String messageId =dc.getDocument().getId();
                            String userId = dc.getDocument().get("userId").toString();
                            Long time = (Long) dc.getDocument().get("time");
                            MessageItem messageItem = new MessageItem(message,messageId,name,userId,time);
                            Log.i("messageId",messageId);
                            messageItems.add(0,messageItem);
                            adapter.notifyDataSetChanged();
                        }

                    }
                });
    }

}

共有1个答案

朱乐逸
2023-03-14

您所描述的是预期的行为:当附加快照侦听器时,它读取集合中存在的或与查询匹配的所有数据。

如果您想要获得该数据的子集,您应该在查询中添加条件以仅检索该子集。例如,仅获取已修改数据的一种常用方法是在每个设置为FieldValue.ServerTimestamp()的文档中存储LastModified字段,然后仅查询LastModified晚于“now”的文档。

 类似资料:
  • 对于分支子项,它只给出2,而消息子项则给出所有消息。如何只获取已更改的邮件子详细信息。 我试图像这样查询chat.branchid.$branchid.message.$messageid

  • 这是我编写的函数,它在编辑指定的单元格/行/列时发送电子邮件通知某人,并将其设置为触发OneEdit。它按原样工作。 我的问题是,我只需要在编辑电子表格的某个工作表(页面)上的列或行时,而不是在电子表格中的任何工作表中的列X时,才能工作。 有什么想法吗?我希望这是我错过的简单的事情,但我一直找不到解决办法。

  • 如何使用将所有可用字符读入? 编辑 1。委托不关心字符串有多长,它只需要处理通过套接字到达的任何哈达-以及它的全部内容 2。我不需要将数据切成块--我希望读取到达 3的每一个信息。是的,我有一个无限循环,因为我需要保持与套接字的连接并监听数据,直到客户端删除连接-当我获得时。我为套接字使用单独的线程,因为会有更多的套接字要听。

  • 更新时我们需要发送所有的字段,而不仅仅是要更新的字段吗? 在做fullstackopen的练习的时候,对这个题目描述不解?当我们只需更新likes字段,需要将其他的字段信息也放到请求中吗? 对这个项目做一个简短的介绍 使用到的一些技术: mongodb、react、axios(用于前端和后端通信)、express、restful 后端相关的操作如下所示 经过测试发现,findByIdAndUpda

  • 问题内容: 一个简单的问题:即使您不知道所有字段,也可以将所有数据发布到页面上吗? 例如,我想编写一个简单的脚本来收集所有发布的数据并通过电子邮件发送。我可以预见,表单中的字段可能会随着时间的推移而发生很大变化,因此从长远来看可以节省一些时间,我想知道是否可以编写自动收集所有内容的内容? 可能吗? 问题答案: 当然。只需遍历数组即可:

  • 问题内容: 代码 版画 哪个是对的。 但是从逻辑上讲,子字符串 也匹配正则表达式。 所以,我怎样才能使代码找到那些子也一样,即不仅 多数扩展 之一,也是它的 孩子们 ? 问题答案: 您可以使用诸如和的勉强限定词。与标准相比,它们尽可能少地匹配并且贪婪地匹配,即尽可能地匹配。尽管如此,这仅允许您找到特定的“子匹配项”,而不是全部。使用提前控制非捕获组可以实现更多控制,文档中也有介绍。但是,为了真正找