我有一个Firebase消息对象列表,每个对象都可以在打开活动之前进行更新,此时将触发Firebase ChildEventListener()
(在onChildAdded()
中处理子对象)。
此更新在setValue()
字段上使用了status
:
database.getReference("Messages").child(roomID).child(msgID).child("status").setValue("delivered");
打开活动后,ChildEventListener()
将对所有孩子罚款。但是,对于事先状态已更新的那些孩子(消息),他们为null
字段以外的所有字段返回status
。
在Firebase数据库中,所有字段均应保留(非空),因此数据没有任何问题。
退出活动并重新进入后,所有子项都按原样返回ChildEventListener()
中(不再返回任何空数据)。
简而言之,在对该子节点运行ChildEventListener()
之后,需要两次setValue()
调用才能返回该子节点的所有数据。
如果需要,可以提供更多代码和上下文。让我知道。
编辑1::这是侦听器:(位于onResume()
中)
newMessageListner = myMessageRoomRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, String previousChildName) {
if (dataSnapshot.exists()) {
String messageKey = dataSnapshot.getKey();
Message messageClass = dataSnapshot.getValue(Message.class);
String messageUserID = messageClass.getUserId();
Log.d(TAG, "Message Key: " + messageKey);
Log.d(TAG, "Message Status: " + messageClass.getStatus());
Log.d(TAG, "Message User ID: " + messageUserID);
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String previousChildName) {}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
编辑2:我在getValue()
的{{1}}中呼叫sendNotification()
FirebaseMessagingService