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

如何在Firebase Database中添加多条相同类型的子节点记录

问题根源

你当前代码每次提交都是向Medium Pack这个固定名称的子节点写入数据,Firebase对同一个节点执行setValue操作默认就是覆盖原有数据,所以才会出现多次提交只保留一条、修改原有字段的情况。

解决方案1:使用Firebase官方唯一键生成(推荐)

Firebase Realtime Database 自带push()方法,调用后会自动生成带时间序的唯一子节点键,完全不会重复,无需自己处理编号逻辑,改法非常简单:
修改mediumPack方法中的写入逻辑即可:

// 原代码
// referenceMP.child("Medium Pack")
//    .setValue(map)

// 修改后
referenceMP.push()
    .setValue(map)

修改后每次提交都会生成独立的子节点,所有申请记录都会完整保留。

解决方案2:自定义工单编号作为节点名

如果你需要按指定格式生成工单编号当节点名,可以用如下方法生成符合MP-18位随机字符-5000格式的编号:

第一步:添加随机编号生成方法

private String generateMPOrderId() {
    // 字符集可按需调整,建议不要加Firebase节点名不允许的特殊字符(. # $ [ ] /)
    String charPool = "ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjklmnpqrstuvwxyz23456789";
    StringBuilder randomStr = new StringBuilder(18);
    Random random = new Random();
    for (int i = 0; i < 18; i++) {
        randomStr.append(charPool.charAt(random.nextInt(charPool.length())));
    }
    return "MP-" + randomStr + "-5000";
}

上面的字符池特意去掉了易混淆的0、O、1、I,你可以根据业务需求调整。

第二步:修改写入逻辑

String orderId = generateMPOrderId();
referenceMP.child(orderId)
    .setValue(map)

注:随机生成编号的重复概率极低,若要完全规避重复风险,可以在写入前先判断对应编号的节点是否存在,或者直接使用方案1的push方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 15:54:04