【发布时间】:2021-07-01 23:30:31
【问题描述】:
您好,我在 Spring 项目中使用 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 与带有最新添加聊天消息的子节点。
【问题讨论】:
标签: firebase firebase-realtime-database firebase-admin