Firebase Realtime Database удалить конкретного пользователя - PullRequest
0 голосов
/ 15 ноября 2018

Я хочу удалить конкретного пользователя с номером телефона 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 голосов
/ 15 ноября 2018

Может быть, с моим комментарием непонятно, поэтому я ставлю это как ответ, полный код, который не должен иметь проблему, с которой вы столкнулись, должен выглядеть примерно так:

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() в этом списке, вы получаете ключ от места, где вы выполнили запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...