不从 firebase 实时数据库中删除消息

Not deletion of messages from firebase realtime database

提问人:Arnav Gupta 提问时间:11/9/2023 最后编辑:Arnav Gupta 更新时间:11/10/2023 访问量:57

问:

在从 android studio 创建聊天应用程序时,Jawa 和 firebase 消息不会从 firebase 中删除。 当应用程序在android设备上运行并发出命令(从程序和firebase控制台)以从firebase Realtime Database删除消息时,一旦它们被删除,但同时,它们再次出现在firebase中。 当应用程序未在设备中运行时,它们将从控制台中删除(单击从 firebase 中删除节点)。

在 firebase 实时数据库规则中,我还向每个人授予了读写权限(即将读写设置为 true)

请帮我解决这个问题

我已经尝试了很多,使用不同的线程进行删除(使用删除以及设置值空命令进行删除)和更改 firebase 的规则,但是当应用程序在设备上运行时,我没有得到删除消息的结果。 请提供相同的解决方案。

  public class Chat_detail_Activity extends AppCompatActivity implements Chat_message_recyclesAdapter.updateListIntefaceCallBack {
    ActivityChatDetailBinding binding;
    ArrayList<MessageModel> messagelist;
    HashSet<String> deleteMessagelist;
    Chat_message_recyclesAdapter chatMessageRecyclesAdapter;
    String receiverName, receiverId, receiverPic;
    String senderRoom, receiverRoom, senderId;
 
    FirebaseDatabase database;
    FirebaseStorage storage;
    FirebaseAuth firebaseAuth;
    Toolbar deleteToolbar, normalToolbar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ActivityChatDetailBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());
        deleteToolbar = binding.chatDetailToolbarChatDelete;
        normalToolbar = binding.chatDetailToolbar;
        deleteMessagelist = new HashSet<>();

        messagelist = new ArrayList<>();

        chatMessageRecyclesAdapter = new Chat_message_recyclesAdapter(this, messagelist);
        chatMessageRecyclesAdapter.setInterface_DeleteList(this);

        senderId = FirebaseAuth.getInstance().getUid();
        database = FirebaseDatabase.getInstance();
        storage = FirebaseStorage.getInstance();
        firebaseAuth = FirebaseAuth.getInstance();

        init();
    //send message on click
    binding.imageViewsendChatdetail.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Date date = new Date();
            String messageTxt = binding.edtMsgChatdetail.getText().toString().trim();
            if (messageTxt.trim().isEmpty()) {


            } else {

                MessageModel message = new MessageModel(senderId, messageTxt, date.getTime());
                binding.edtMsgChatdetail.setText("");

                database.getReference().child("Chats").child(senderRoom)
                        .child("Messages").push().addValueEventListener(new ValueEventListener() {
                            @Override
                            public void onDataChange(@NonNull DataSnapshot snapshot) {

                                String messageKeyId=snapshot.getKey();
                                message.setMessageNodeId(messageKeyId);
                                database.getReference().child("Chats").child(senderRoom)
                                        .child("Messages").child(messageKeyId).setValue(message).addOnSuccessListener(new OnSuccessListener<Void>() {
                                            @Override
                                            public void onSuccess(Void unused) {
                                                database.getReference().child("Chats").child(receiverRoom)
                                                        .child("Messages").child(messageKeyId).setValue(message);


                                            }
                                        });

                            }

                            @Override
                            public void onCancelled(@NonNull DatabaseError error) {

                            }
                        });



            }


        }
    });
        binding.chatDetailRecycleView.setAdapter(chatMessageRecyclesAdapter);
        senderRoom = senderId + receiverId;
        receiverRoom = receiverId + senderId;

        // Showing messages
        database.getReference().child("Chats").child(senderRoom).child("Messages").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                messagelist.clear();
                for (DataSnapshot dataSnapshot : snapshot.getChildren()) {
                    MessageModel messageModel = dataSnapshot.getValue(MessageModel.class);
                    messagelist.add(messageModel);
                    chatMessageRecyclesAdapter.notifyDataSetChanged();
                }
                binding.chatDetailRecycleView.scrollToPosition(messagelist.size() - 1);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
                Toast.makeText(Chat_detail_Activity.this, error.getMessage(), Toast.LENGTH_SHORT).show();
            }
        });

        // Deleting message
        binding.chatDetailToolbarChatDelete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ExecutorService service = Executors.newSingleThreadExecutor();
                service.execute(new Runnable() {
                    @Override
                    public void run() {
                        for (String deleteMessageNodeId : deleteMessagelist) {
                            database.getReference().child("Chats").child(senderRoom).child("Messages")
                                    .child(deleteMessageNodeId).removeValue();
                        }
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                chatMessageRecyclesAdapter.reset();
                            }
                        });
                    }
                });
            }
        });
    }

    private void init() {
        receiverName = getIntent().getStringExtra("receiverName");
        receiverId = getIntent().getStringExtra("receiverUID");
        receiverPic = getIntent().getStringExtra("receiverPic");

        binding.receiverNameChatDetailText.setText(receiverName);
        Picasso.get().load(receiverPic).placeholder(R.drawable.blank_profile_pic).into(binding.receiverPicChatDetailImg);
    }

    @Override
    public void updateList() {
        // Updating List
        deleteMessagelist = chatMessageRecyclesAdapter.getDeleteMessageList();

        // Updating Toolbar
        if (!deleteMessagelist.isEmpty()) {
            normalToolbar.setVisibility(View.GONE);
            deleteToolbar.setVisibility(View.VISIBLE);
            setSupportActionBar(deleteToolbar);
            binding.selectedMessagesChatDetailText.setText(String.valueOf(deleteMessagelist.size()));
            binding.totalMessagesChatDetailText.setText(String.valueOf(messagelist.size()));
        } else {
            deleteToolbar.setVisibility(View.GONE);
            normalToolbar.setVisibility(View.VISIBLE);
            setSupportActionBar(normalToolbar);
        }
    }
}
java android firebase-realtime-database removechild

评论

0赞 Community 11/9/2023
请提供足够的代码,以便其他人可以更好地理解或重现问题。
0赞 Arnav Gupta 11/9/2023
我更新了上面的java代码问题,当应用程序在android设备中运行时,我从firebase中删除数据时出现错误
0赞 Alex Mamo 11/9/2023
你得到的确切错误是什么?请使用@AlexMamo回复
0赞 Alex Mamo 11/9/2023
除此之外,如果你了解 Kotlin,这里有一些有用的资源(12)可能会有所帮助。
0赞 Arnav Gupta 11/9/2023
@AlexMamo firebase 会继续复制我在 firebase 中使用 removeValue() 命令删除的数据,导致无法删除数据

答: 暂无答案