John Enokela
John Enokela

Reputation: 25

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: image

Upvotes: 1

Views: 4890

Answers (1)

Frank van Puffelen
Frank van Puffelen

Reputation: 599581

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

Upvotes: 1

Related Questions