Как удалить сообщения из базы данных firebase?

Я создаю приложение для чата. Я хочу, чтобы пользователи могли удалять чаты и сообщения из базы данных firebase. Ниже приведен код адаптера сообщений, который я пытался использовать для удаления сообщений, он отлично работает, когда я долго нажимаю на сообщение, но когда я снова вхожу в приложение, сообщения возвращаются. Я использую базу данных firebase

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;

    }
}

}

Это снимок экрана моей базы данных для дерева сообщений: Как удалить сообщения из базы данных firebase?

вы можете добавить какое-то поле, например isDeleted, к объекту сообщения и установить его на true при удалении сообщения и перед отображением сообщения проверьте, удалено оно или нет

Vladyslav Matviienko 17.11.2018 17:34
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
3 362
1

Ответы 1

Кажется, это код, в котором вы удаляете сообщение:

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

Это удаляет сообщение только от адаптера, но не из базы данных. Поэтому логично, что сообщение появляется снова, когда вы перезапускаете приложение.

Чтобы удалить сообщение навсегда, вам также необходимо удалить его из базы данных. Поскольку вы не рассказали, как вы загружаете данные, сложно назвать точный код. Но это будет что-то вроде:

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

Что бы вы хотели увидеть или узнать, чтобы помочь мне, я пробовал все, что мог, и мне действительно нужно, чтобы это работало. @ Франк ван Пуффелен

John Enokela 17.11.2018 20:02

Кажется, что ни один из ваших кодов не вызывает базу данных для удаления значения, что является способом заставить эту работу работать. Если мое объяснение имеет смысл: попробуйте выяснить, какой элемент выбрал пользователь, и вызовите removeValue() в DatabaseReference по этому пути. Если это не имеет смысла, я надеюсь, что кто-то другой сможет объяснить это лучше, чем я или документы.

Frank van Puffelen 17.11.2018 21:46

Другие вопросы по теме