我在这里给了我的火盆聊天室。我在这里包含的代码可以检索单个节点的消息。我想通过单个查询搜索所有聊天室的新消息,以便我可以发送推送通知。另外如何知道消息是否是新的,哪个是我收到的最后一条消息?
private void loadEventListFromDatabase()
{
DatabaseRef.userRef.child("ChatRoom").child(roomID).addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
GetMessage getMessage = dataSnapshot.getValue(GetMessage.class);
Message message = new Message(getMessage.getMessageBody(),getMessage.getCreator(),imageCode);
recyclerViewRCV.setLayoutManager(getMyLinearLayout());
recieveMessageList.add(message);
recieveMsgAdapter.notifyDataSetChanged();
}
@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
Firebase数据库查询在节点列表上运行,而不是在树上运行。如果要获取所有房间中所有新消息的列表,则必须列出所有房间中的所有消息。
有关详细信息,请参阅:
当您附加侦听器时,Firebase没有内置任何内容来跟踪两次消息的新内容。这意味着您需要自己构建它。
两种常见的方法是:
后者是迄今为止最简单和最常见的。在您的情况下,您可以简单地保留用户看到的最后一条消息的密钥(在数据库中,或在应用程序的本地存储中),然后在下次使用ref.orderByKey().startAt(lastKeySeen)
时传递它。
有关详细信息,请参阅: