如何不删除已有数据且不使用push()向Firebase子节点添加UID?
解决方案
你要的效果可以通过将用户UID直接作为节点键实现,完全不需要push()生成的随机键,同时可以解决原有逻辑误删其他用户数据的问题,具体修改如下:
- 修正旧网格清理逻辑
原有逻辑直接删除整个网格节点会清空该网格下所有其他用户的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(); } }
- 替换写入逻辑,去掉不必要的监听器
原有代码中添加的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
相关产品推荐
相关产品推荐

