首页 > 解决方案 > 为什么我在尝试删除某些内容时不断从 Firebase 获取重复数据?

问题描述

为什么每当我尝试从我的 Firebase 中删除某些内容时,我总是会收到重复的数据?在我的 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();
    }

标签: androidfirebasefirebase-realtime-database

解决方案


就像 Imran 所说,当您将 an 附加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();

                        }
                    });
                }
            }

推荐阅读