我想使用帖子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();
}
});
但是它将删除所有数据库。
这里是结构:
答案 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();