删除数据库中的特定帖子(按帖子节点),但会删除整个database_table

时间:2018-10-14 13:57:23

标签: android firebase firebase-realtime-database

我想使用帖子ID删除客户表中的特定节点。

 btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            DatabaseReference ref = FirebaseDatabase.getInstance().getReference();
            Query applesQuery = ref.child("customers").orderByChild("post").equalTo(postid);
            applesQuery.getRef().removeValue();
            Toast.makeText(getContext(), "deleted", Toast.LENGTH_SHORT).show();

        }
    });

但是它将删除所有数据库。

这里是结构:

enter image description here

1 个答案:

答案 0 :(得分:3)

所有节点都被删除的原因在此行:

applesQuery.getRef().removeValue();

Query.getRef()调用返回此查询运行的位置。由于applesQuery是对post的查询,因此applesQuery.getRef()返回post节点本身。因此,applesQuery.getRef().removeValue()删除了整个post节点。

在Firebase中,您没有将DELETE FROM customer WHERE post = postid发送到“删除查询”的概念。 Firebase仅在知道节点的确切路径时才能删除它。这意味着您将需要执行查询,循环查询结果并删除每个结果。

在代码中:

DatabaseReference ref = FirebaseDatabase.getInstance().getReference();
Query applesQuery = ref.child("customers").orderByChild("post").equalTo(postid);
applesQuery.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot postSnapshot: dataSnapshot.getChildren()) {
            postSnapshot.getRef().removeValue()
        }
    }

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

更新:我现在注意到post属性的值与您作为客户密钥的值相同。如果总是这样,则不需要查询即可删除节点,只需执行以下操作即可:

ref.child("customers").child(postid).removeValue();