微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Firebase admin sdk 监听实时数据库

如何解决Firebase admin sdk 监听实时数据库

嗨,我正在使用 Firebase 管理 SDK 在我的春季项目中学习 Firebase 实时数据库。我的主要意图是根据添加到 firebase 数据库主节点的子(新聊天)项目向用户发送通知

enter image description here

就像上图一样,我的数据库树结构很简单,它在此节点下有一个名为 CHATS 的主节点,正在两个用户之间创建许多其他 child node to create 1-to-1 聊天。每个单个子节点都会有许多其他带有聊天消息的子节点。

使用 Firebase admin sdk 正在监听主节点,即。 CHATS

  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 方法将使用包含所有子节点的数据快照触发。假设如果新的聊天消息添加USER5-USER6 节点,那么 onChildChanged 方法会被所有以前的聊天消息触发,但我知道这是预期的行为。将侦听器附加到主节点的原因是要知道何时在两个用户之间启动新的聊天节点。如果我的子节点有多个聊天消息,我害怕 firebase 成本,那么每次 onChildChanged 方法都会有包含所有聊天消息的数据快照。

我想知道我们是否可以过滤对子节点所做的更改,以便让 onChildChanged 与带有最新添加聊天消息的子节点一起使用。

解决方法

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?