You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Firebase实时数据库获取自动生成的Push ID

问题:如何获取Firebase push()生成的消息唯一ID?

我用Firebase的push()方法给每条消息生成唯一ID,想知道怎么获取这个ID,以下是我的消息发送代码:

String messageSenderRef = "Messages/" + messageSenderID + "/" + messageReceiverID;
String messageReceiverRef = "Messages/" + messageReceiverID + "/" + messageSenderID;

DatabaseReference userMessagesKeyRef = reference.child("Messages")
        .child(messageSenderID).child(messageReceiverID).push();

String messagePushID = userMessagesKeyRef.getKey();

Map messageTextBody = new HashMap();
messageTextBody.put("message",messageText);
messageTextBody.put("type","text");
messageTextBody.put("to",messageReceiverID);
messageTextBody.put("from",messageSenderID);
messageTextBody.put("time",time);
messageTextBody.put("date",date);
messageTextBody.put("isSeen",false);
messageTextBody.put("messageID",messagePushID);


Map messageBodyDetails = new HashMap();
messageBodyDetails.put(messageSenderRef + "/" + messagePushID,messageTextBody);
messageBodyDetails.put(messageReceiverRef + "/" + messagePushID,messageTextBody);

我的Firebase数据库节点结构:

Firebase数据库节点结构


解决方案

你当前的代码已经正确获取到了push()生成的唯一ID,就是通过userMessagesKeyRef.getKey()得到的messagePushID变量。

具体说明:

  • 调用push()方法时,Firebase会立即生成唯一ID,无需等待数据写入完成就能获取
  • push()返回的DatabaseReference对象包含这个新ID,调用getKey()即可提取
  • 你已经把该ID存入消息数据的messageID字段,同时用它作为节点路径的一部分写入发送方和接收方的消息节点,这个做法完全正确

如果后续读取消息时需要获取该ID,有两种方式:

  1. 直接从消息数据的messageID字段读取(你已存储该值)
  2. 监听消息节点时,通过DataSnapshot.getKey()获取节点键(即push生成的ID)

读取消息的示例代码:

reference.child("Messages").child(currentUserID).child(targetUserID)
        .addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    // 获取push生成的ID
                    String messageId = snapshot.getKey();
                    // 读取已存储的messageID
                    String storedMessageId = snapshot.child("messageID").getValue(String.class);
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                // 处理错误逻辑
            }
        });

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 08:15:43