在我的聊天应用中,当在FcmService中收到消息通知时,会为该msgId设置deliveryReceipt。
这是我在收到该消息的通知时更新消息对象的特定字段的方式。
FirebaseDatabase.getInstance().getReference("messages/groups")
.child(groupId)
.child("-L7VySOmgmcePMVokcVj") //messageId
.child("deliveryReceipts")
.child(FirebaseAuth.getInstance().getUid())
.setValue(System.currentTimeMillis());
使用新字段" deliveryReceipts "
成功更新邮件现在,当我打开聊天本身,同步所有聊天消息时,onChildAdded()
的最后一次迭代仅使用我之前明确更新的字段触发,即" deliveryReceipts "
FirebaseDatabase.getInstance().getReference("messages/groups")
.child(groupId)
.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
final ChatData chatData = dataSnapshot.getValue(ChatData.class);
if (chatData != null) {
Log.d(TAG, "onChildAdded: " + dataSnapshot);
}
}
Firebase过滤日志的方式如下:
CHILD_ADDED:{-L7W43o02tkhToxee5dQ:{deliveryReceipts = {KS3lGdZkByQI3QTASUuhozfTUB12 = 1520973407769},serverTimestamp = 1520973403735,authorUid = BjqACatBjUSm2kFeEEeUjL7NsCC3,createdTimestamp = 1520973403883,lubbCount = 0,消息= H ICICI}}
CHILD_ADDED:{ - L7W8HtvWnRix1WMpB0Z: {deliveryReceipts = {KS3lGdZkByQI3QTASUuhozfTUB12 = 1520974512436}}}
最后一条消息只有" deliveryReceipts "这是客户为该邮件设置的新字段,缺少authorUid
,createdTimestamp
等旧字段。
正如您在日志中看到的那样。 onChildAdded()
中返回的先前消息很好。只有最近更新的最后一条消息被破坏。
我无法弄清楚为什么只使用我之前更新的字段调用onChildAdded,而没有所有其他字段。
更新:来自onChildAdded
DataSnapshot { key = -L7iEsm4WqF20CbSuAhP, value = {deliveryReceipts={KS3lGdZkByQI3QTASUuhozfTUB12=1521194344681}} }
更新2 以下是打印dataSnapshot本身时的日志,如上面onChildAdded()
的更新代码
D/ChatFragment: onChildAdded: DataSnapshot { key = -L7nmHBXJsLG-PFTF5wm, value = {deliveryReceipts={KS3lGdZkByQI3QTASUuhozfTUB12=1521287243021}} }
更新3 :测试项目的复制方案。这是Github回购:https://github.com/ishaangarg/FireWrite
如何复制:回购中列出的步骤