Firebase数据库新增预订时如何获取对应更新的子节点名称?
Firebase 获取新增预订节点标识的实现问题
原代码存在的问题
你在回调中错误地使用了previousChildName参数,导致获取到的永远不是当前新增节点的标识:
ChildEventListener所有带该参数的回调中,previousChildName的定义是按当前查询排序规则,排在当前触发事件的子节点之前的相邻节点的key,它的设计用途是支持有序列表的分页、节点移动逻辑,从一开始就不是用来表示当前触发事件的节点本身的名称。- 触发事件的节点自身的唯一标识,直接从回调传入的
DataSnapshot对象中读取即可,不需要借助其他参数。
正确实现
不管是新增、修改还是移动子节点的回调,只要拿到了对应操作的DataSnapshot实例,就可以通过snapshot.getKey()直接获取当前节点的名称。
核心代码修改示例:
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("bookings"); reference.addChildEventListener(new ChildEventListener() { @Override public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) { // 直接从当前快照提取新增节点的key String newBookingKey = snapshot.getKey(); Toast.makeText(ExampleService.this, "新增预订节点: " + newBookingKey, Toast.LENGTH_SHORT).show(); } @Override public void onChildChanged(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) { // 变更节点同样直接从快照取key String changedBookingKey = snapshot.getKey(); Toast.makeText(getApplicationContext(), "变更预订节点: " + changedBookingKey, Toast.LENGTH_SHORT).show(); } @Override public void onChildRemoved(@NonNull DataSnapshot snapshot) { String removedBookingKey = snapshot.getKey(); Toast.makeText(getApplicationContext(), "移除预订节点: " + removedBookingKey, Toast.LENGTH_SHORT).show(); } @Override public void onChildMoved(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) { String movedBookingKey = snapshot.getKey(); Toast.makeText(getApplicationContext(), "移动预订节点: " + movedBookingKey, Toast.LENGTH_SHORT).show(); } @Override public void onCancelled(@NonNull DatabaseError error) { Toast.makeText(getApplicationContext(), "数据库监听出错: " + error.getMessage(), Toast.LENGTH_SHORT).show(); } });
补充注意点
- 如果预订数据是通过Firebase的
push()方法自动生成节点key写入的,通过上述方法拿到的key就是系统自动生成的唯一ID,和写入时的节点完全对应。 - 只有在实现有序列表分页、拖拽排序这类需要依赖前序节点位置的逻辑时,才需要用到
previousChildName参数,日常业务逻辑中定位节点时基本不需要关心这个参数。
内容的提问来源于stack exchange,提问作者dheeraj pal
相关产品推荐
相关产品推荐

