Firebase实时数据库删除特定用户

时间:2018-11-15 15:19:06

标签: android firebase firebase-realtime-database

我希望从数据库中删除电话号码为X的特定用户。然后插入我的代码会删除所有这些代码。

这是我的数据库:

enter image description here

代码:

    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());
            }


        });
    }

1 个答案:

答案 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(),因此您将获得运行查询的位置的键。