我希望从数据库中删除电话号码为X的特定用户。然后插入我的代码会删除所有这些代码。
这是我的数据库:
代码:
private static void deleteUser(final Context context, final String phoneNumber) {
DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("users");
Query usersQuery = databaseReference.orderByChild("phone").equalTo(phoneNumber);
usersQuery.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
dataSnapshot.getRef().removeValue().addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
Log.d(TAG, "Deleted");
}
});
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.d(TAG, "onCancelled", databaseError.toException());
}
});
}
答案 0 :(得分:1)
也许我的评论不清楚,所以我将其作为答案,应该不会遇到您所遇到的问题的完整代码应如下所示:
usersQuery.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot ds: dataSnapshot.getChildren()) {
ds.getRef().removeValue().addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
Log.d(TAG, "Deleted");
}
});
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.d(TAG, "onCancelled", databaseError.toException());
}
});
那是因为您使用的是singleValueEventListener
。如果查询与多个子项匹配,则返回所有这些子项的列表。
即使只有一个匹配的孩子,它仍然是一个孩子的列表。而且,由于您要在该列表上调用getRef()
,因此您将获得运行查询的位置的键。