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

如何不删除已有数据且不使用push()向Firebase子节点添加UID?

解决方案

你要的效果可以通过将用户UID直接作为节点键实现,完全不需要push()生成的随机键,同时可以解决原有逻辑误删其他用户数据的问题,具体修改如下:

  1. 修正旧网格清理逻辑
    原有逻辑直接删除整个网格节点会清空该网格下所有其他用户的UID,仅需要删除当前用户在旧网格中的对应节点即可:
public void changeProviderServiceCells(int oldRadius) {
    Truck truck = MainActivity.mUser.getTruck();
    FirebaseAuth auth = FirebaseAuth.getInstance();
    String uid = auth.getCurrentUser().getUid();
    oldGridRadius = getProvidersRadius(oldRadius, MainActivity.mUser.getGrid());
    DatabaseReference ref = FirebaseDatabase.getInstance().getReference(MainActivity.GPS_PATH);
    // 清理旧网格中当前用户的记录,不影响其他用户
    for (int x = 0; x < oldGridRadius.length; x++) {
        for (int y = 0; y < oldGridRadius.length; y++) {
            String gridString = String.valueOf(oldGridRadius[y][x]);
            ref.child(gridString).child(uid).removeValue();
        }
    }
  1. 替换写入逻辑,去掉不必要的监听器
    原有代码中添加的ValueEventListener属于永久监听器,会反复触发写入逻辑,完全不需要。直接将UID作为键写入,值设为true即可,同一个UID只会存在一条记录,不会生成冗余数据:
gridRadius = getProvidersRadius(truck.getRadius(), MainActivity.mUser.getGrid());
    MainActivity.matrix = gridRadius.clone();
    // 向新网格写入当前用户UID作为键
    for (int x = 0; x < gridRadius.length; x++) {
        for (int y = 0; y < gridRadius.length; y++) {
            DatabaseReference db = FirebaseDatabase.getInstance().getReference(MainActivity.GPS_PATH)
                    .child(String.valueOf(gridRadius[y][x]))
                    .child(uid);
            db.setValue(true);
        }
    }
}

修改后效果

  • 数据结构变为GPS路径 -> 网格编号 -> {用户1UID: true, 用户2UID: true...},没有额外生成的随机键,符合你的需求
  • 所有操作不会修改、删除其他用户的已有数据
  • 后续查询网格内用户时,直接遍历网格节点的子键即可拿到所有UID,处理效率更高
  • 天然去重,同一个UID不会在同一个网格下重复存储

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 09:36:03