从Android Firebase中移除值会删除整个节点

时间:2017-02-17 21:40:59

标签: java android firebase firebase-realtime-database

我正在按照指南here删除我的firebase数据库中的值。这是我数据的结构。

 |---users
     |----KJSXd4ScEmJ6N4UFc5k 
          |---bookmarks
              |---KdCyKdQkDg34ny6_H-C
                  |---id:"12d5j2fa-0f70-41c3-b4g4-4d66bdcef976"
              |---KdCyKdQkDg34ny6_H-M
                  |---id:"fa95b1fa-b537-4d98-a0e7-a92ffea7b6a4"

这是我正在使用的代码。

FirebaseDatabase.getInstance().getReference().child(MyConstants.FIREBASE_USERS_NODE).child(FirebaseAuth.getInstance().getCurrentUser().getUid())
                .child(MyConstants.FIREBASE_BOOKMARKS_NODE).orderByChild("id").equalTo(uuid).addListenerForSingleValueEvent(
                new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        dataSnapshot.getRef().removeValue();
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {
                    }
                });

正在发生的事情是整个/书签节点在此单个调用中被删除,而不仅仅是对所需书签的引用。我怎样才能实现删除我要删除的单个书签而不是整个节点?

2 个答案:

答案 0 :(得分:2)

对Firebase数据库执行查询时,可能会有多个结果。因此快照包含这些结果的列表。即使只有一个结果,快照也会包含一个结果的列表。

因此,在您的情况下,快照不是项目,但它是查询的总结果。因此,getRef()返回您触发查询的位置。

解决方案是循环结果并逐个删除:

public void onDataChange(DataSnapshot dataSnapshot) {
    for (DataSnapshot child: dataSnapshot.getChildren()) {
        child.getRef().removeValue();
    }
}

答案 1 :(得分:0)

为什么要监听该节点的SingleValueEvent,只需尝试以下代码即可。

FirebaseDatabase.getInstance().getReference().child(MyConstants.FIREBASE_USERS_NODE).child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child(MyConstants.FIREBASE_BOOKMARKS_NODE).child(uuid).removeValue();