Почему я продолжаю получать дублированные данные из Firebase при попытке удалить что-то? - PullRequest
0 голосов
/ 18 октября 2019

Почему я продолжаю получать дублированные данные, когда пытаюсь что-то удалить из своей базы данных? В моем методе onStart я получил информацию о пользователях с подозрением, и я пытаюсь удалить конкретный постучавший элемент, но всякий раз, когда я делаю это, я продолжаю получать дублированные данные. Почему это?

 //looped through Contact node access receiver UID and searched user ref for necessary information..
    @Override
    public void onStart() {
        super.onStart();

        contactsRef.child(currentFirebaseUser.getUid()).addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot dsp : dataSnapshot.getChildren()) {
                    usersFriendsKey = dsp.getKey();
                    Log.i("friendsKey", usersFriendsKey);

                    usersRef.child(usersFriendsKey).addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            userData = dataSnapshot.getValue(UserData.class);
                            contactsArrayList.add(userData);
                            chatListAdapter.notifyDataSetChanged();
                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {
                            String error = databaseError.getMessage();
                            Toast.makeText(getActivity(), "Error occured", Toast.LENGTH_SHORT).show();

                        }
                    });
                }
            }

Удаляет элемент

//Creates popup and allows user to delete a post from recycle view...
    public void deletePostMenu(final View v, final int position) {
        PopupMenu popup = new PopupMenu(v.getContext(), v);
        popup.getMenuInflater().inflate(R.menu.delete_menu, popup.getMenu());
        selectedUserId = contactsArrayList.get(position).getUser();

        popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                switch (item.getItemId()) {
                    case R.id.deleteMenu:
                        contactsRef.child(currentFirebaseUser.getUid()).child(selectedUserId).removeValue();
                        return true;


                        default:
                        //default intent
                        return true;
                }
            }
        });
        popup.show();
    }

1 Ответ

0 голосов
/ 18 октября 2019

Как говорит Имран, когда вы присоединяете addValueEventListener к ссылке, она открывает сокет для продолжения прослушивания изменений в этой ссылке.

Когда вы делаете удаление, обновление или любое изменение в этой ссылкессылка, триггер сработает, и вы будете добавлять новые элементы по этой ссылке из вашего первого фрагмента кода.

Что вы можете сделать, это прикрепить addListenerForSingleValueEvent, и он будет срабатывать только один раз.

Таким образом, после удаления определенного узла он не будет запускать другой код, который прослушивает этот узел.

@Override
    public void onStart() {
        super.onStart();

        contactsRef.child(currentFirebaseUser.getUid()).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot dsp : dataSnapshot.getChildren()) {
                    usersFriendsKey = dsp.getKey();
                    Log.i("friendsKey", usersFriendsKey);

                    usersRef.child(usersFriendsKey).addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            userData = dataSnapshot.getValue(UserData.class);
                            contactsArrayList.add(userData);
                            chatListAdapter.notifyDataSetChanged();
                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {
                            String error = databaseError.getMessage();
                            Toast.makeText(getActivity(), "Error occured", Toast.LENGTH_SHORT).show();

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