简体   繁体   中英

How to delete messages from a firebase database?

I am making a chat app I want the users to be able to delete chats and messages from firebase database Below is the code for the message adapter I tried using some code to delete the messages, it works fine when I long click on the message but when I log back into the app the messages come back. I use firebase database

package com.paddi.paddi.paddi;

import android.graphics.Color;
import android.support.v7.widget.RecyclerView;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import com.squareup.picasso.Picasso;

import java.util.List;

import de.hdodenhof.circleimageview.CircleImageView;

/**
 * Created by paddi on 15/11/2017.
 */

public class MessageAdapter extends RecyclerView.Adapter<MessageAdapter.MessageViewHolder>
{
    private List<Messages> userMessagesList;

    private FirebaseAuth mAuth;
    private DatabaseReference UsersDatabaseReference;







    public MessageAdapter(List<Messages> userMessagesList)
    {
        this.userMessagesList = userMessagesList;

    }


// I tried using this to delete the chats it works but every time i log into the app again the messages re-appear


    public void delete(int position){


        userMessagesList.remove(position);
        notifyItemRemoved(position);





    }




    @Override
    public MessageViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
    {

        View V = LayoutInflater.from(parent.getContext())
                                .inflate(R.layout.messages_layout_of_users, parent, false);


        mAuth = FirebaseAuth.getInstance();




        return new MessageViewHolder(V);



    }





    @Override
    public void onBindViewHolder(final MessageViewHolder holder, int position)
    {


        String message_sender_id = mAuth.getCurrentUser().getUid();
            Messages messages = userMessagesList.get(position);

        String fromUserId = messages.getFrom();
        String fromMessageType = messages.getType();

        UsersDatabaseReference = FirebaseDatabase.getInstance().getReference().child("Users").child(fromUserId);
        UsersDatabaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot)
            {
                String userName = dataSnapshot.child("user_name").getValue().toString();
                String userImage = dataSnapshot.child("user_thumb_image").getValue().toString();

                Picasso.with(holder.ReceiverProfileImage.getContext()).load(userImage)
                        .fit().centerInside().placeholder(R.drawable.default_profile).into(holder.ReceiverProfileImage);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });


        if (fromMessageType.equals("text"))
        {
            holder.ReceiverMessageText.setVisibility(View.INVISIBLE);
            holder.messagePicture.setVisibility(View.INVISIBLE);
            holder.ReceiverProfileImage.setVisibility(View.INVISIBLE);
            holder.SenderMessageText.setVisibility(View.INVISIBLE);
            // You comment this last line out in case of any errors

            if (fromUserId.equals(message_sender_id))
            {
                // You comment this first line out in case of any errors
                holder.SenderMessageText.setVisibility(View.VISIBLE);
                holder.SenderMessageText.setBackgroundResource(R.drawable.sender_message_text_background);
                holder.SenderMessageText.setTextColor(Color.WHITE);
                holder.SenderMessageText.setGravity(Gravity.START);
                holder.SenderMessageText.setText(messages.getMessage());
            }

            else
            {

                holder.SenderMessageText.setVisibility(View.INVISIBLE);

                holder.ReceiverMessageText.setVisibility(View.VISIBLE);
                holder.ReceiverProfileImage.setVisibility(View.VISIBLE);
                holder.messagePicture.setVisibility(View.VISIBLE);

                holder.ReceiverMessageText.setBackgroundResource(R.drawable.receiver_message_text_background);
                holder.ReceiverMessageText.setTextColor(Color.WHITE);
                holder.ReceiverMessageText.setGravity(Gravity.START);
                holder.ReceiverMessageText.setText(messages.getMessage());
            }

           // holder.messageText.setText(messages.getMessage());
        }


    else
    {
          //  holder.messageText.setVisibility(View.INVISIBLE);
           // holder.messageText.setPadding(0,0,0,0);

//            holder.messagePicture.setForegroundGravity(22);
        Picasso.with(holder.ReceiverProfileImage.getContext()).load(messages.getMessage())
                .placeholder(R.drawable.default_profile).into(holder.messagePicture);
    }



}



@Override
public int getItemCount()
{
    return userMessagesList.size();
}


public class MessageViewHolder extends RecyclerView.ViewHolder implements View.OnLongClickListener
{
    public TextView SenderMessageText, ReceiverMessageText;
    public CircleImageView ReceiverProfileImage;
    public ImageView messagePicture;



    public MessageViewHolder(View view) {
        super(view);

        SenderMessageText = (TextView) itemView.findViewById(R.id.sender_message_text);
        ReceiverMessageText = (TextView) itemView.findViewById(R.id.receiver_message_text);
        messagePicture = (ImageView) view.findViewById(R.id.message_image_view);
        ReceiverProfileImage = (CircleImageView) view.findViewById(R.id.messages_profile_image);



        SenderMessageText.setOnLongClickListener(this);
        ReceiverMessageText.setOnLongClickListener(this);
        messagePicture.setOnLongClickListener(this);

    }


    @Override
    public boolean onLongClick(View v) {
        delete(getAdapterPosition());
        return true;

    }
}

}

This is a screenshot of my database for the messages tree: 图片

This seems to be the code where you delete the message:

public void delete(int position){
    userMessagesList.remove(position);
    notifyItemRemoved(position);
}

This only removes the message from the adapter, not from the database. So it makes sense that the message reappears when you restart the app.

To delete the message permanently you'll also have to remove it from the database. Since you didn't share how you load the data, it's hard to give the exact code. But it'll be something like:

FirebaseDatabase.getInstance().getReference("messages").child("key_of_message").removeValue();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM