如何解决Firebase admin sdk 监听实时数据库
嗨,我正在使用 Firebase 管理 SDK 在我的春季项目中学习 Firebase 实时数据库。我的主要意图是根据添加到 firebase 数据库主节点的子(新聊天)项目向用户发送通知。
就像上图一样,我的数据库树结构很简单,它在此节点下有一个名为 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 举报,一经查实,本站将立刻删除。