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

Firebase admin sdk实时监听数据库

程正阳
2023-03-14

正如上图所示,我的数据库树结构很简单,它有一个名为chats的主节点,在这个节点下,我创建了许多其他子节点,以便在两个用户之间创建1-to-1聊天。Evey单个子节点将有许多其他带有聊天消息的子节点。

使用Firebase管理sdk am监听主节点IE。聊天

  private void startListeningToChats() {
    CountDownLatch latch = new CountDownLatch(1);
    try {
        DatabaseReference reference = FirebaseDatabase.getInstance().getReference("/" + appProperties.firebaseChatBucketName);
        reference.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                System.out.println("Child Event added" + s + " " + dataSnapshot.getKey() + " " + dataSnapshot.getValue());
                latch.countDown();
            }

            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {
                latch.countDown();
                System.out.println("Child Event changed" + s + " " + dataSnapshot.getKey() + " " + dataSnapshot.getValue());
            }

            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {
                System.out.println("Child Event removed" + dataSnapshot.getKey());
                latch.countDown();
            }

            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String s) {
                System.out.println("Child Event moved" + s + " " + dataSnapshot.getValue());
                latch.countDown();
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                System.out.println("Child Event cancelled" + databaseError.getMessage());
                latch.countDown();
            }
        });
        latch.await();
    } catch (InterruptedException e) {
        e.printStackTrace();
        latch.countDown();
    }
}

现在,当子节点发生任何更改时,即当在子节点中添加新的聊天消息时,onchildChanged方法将被激发,并使用具有所有子节点的datasnapshot。假设如果新的聊天消息被添加到user5-user6节点,那么onchildChanged方法就会用所有以前的聊天消息触发,但我知道这是预期的行为。将侦听器附加到主节点的原因是为了知道何时两个用户之间启动了新的聊天节点。我担心firebase成本,如果我的子节点有多条聊天消息,那么每次onchildChanged方法都会有包含所有聊天消息的datasnapshot。

我想知道我们是否可以过滤done to子节点的更改,以便使onchildChanged与添加的聊天消息最晚的子节点在一起。

共有1个答案

公良昕
2023-03-14

前一段时间,当我试图在Android中编写一个聊天应用程序时,我也遇到了类似的问题。我很难过地告诉你,没有有效的方法只取最近的数据。您可以使用查询来操作从数据库中获取数据的方式,但它仍然没有那么有效。而且每次下载所有数据的费用几乎是微不足道的。因此,我认为您应该研究一下Java Admin SDK的查询函数,如果没有任何帮助,您可以继续检索所有数据并自己过滤。虽然有一个解决方案,但只要避免并发用户使用相同的帐户,它就很有效。您可以维护同一消息的两个副本,一个节点将包含所有消息,无论何时登录,您都可以使用,您必须显示所有以前的聊天。当前正在发送的消息将被添加到另一个节点,该消息将由另一个用户检索并添加到第一个节点,并且可以删除来自这里的相同消息,因此只有未打开的消息将保留在该分支上。

 类似资料:
  • Sentinel 提供对所有资源的实时监控。如果需要实时监控,客户端需引入以下依赖(以 Maven 为例): <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-transport-simple-http</artifactId> <version>x.y.z</version> </de

  • Listener架构概述 Listener Listener.DrainType (Enum) Filter FilterChainMatch FilterChain Listener Listener proto { "name": "...", "address": "{...}", "filter_chains": [], "use_original_dst": "{...}

  • 我正在用firebase创建一个Ionic 2应用程序,我需要一种方法来监听数据库更改(特别是在child_added上),当应用程序关闭(即在前台、后台和被杀)时 基本上,我想使用WebRTC在whatsapp这样的应用程序内进行呼叫,我正在关注这篇文章https://websitebeaver.com/insanely-simple-webRTC-video-chat-using-fireba

  • 本文向大家介绍vue监听滚动事件实现滚动监听,包括了vue监听滚动事件实现滚动监听的使用技巧和注意事项,需要的朋友参考一下 在vue中实现滚动监听和原生js无太大差异,下面是一个简单的demo,可在控制台查看结果 以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持呐喊教程!

  • 本文向大家介绍Android BroadcastReceiver实现网络状态实时监听,包括了Android BroadcastReceiver实现网络状态实时监听的使用技巧和注意事项,需要的朋友参考一下 前言:最近公司项目重构,为了提高用户的体验,项目中要求添加当前网络状态的实时监听,以便在无网络状态时给用户友好的提醒并修改UI界面。本文将介绍使用四大组件之一的BroadcastReceiver实

  • 本文向大家介绍怎么监听vuex数据的变化?相关面试题,主要包含被问及怎么监听vuex数据的变化?时的应答技巧和注意事项,需要的朋友参考一下