如何在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
相关产品推荐
相关产品推荐

