Загрузка фиксированного количества отфильтрованных сообщений в чат Firebase

#java #firebase #firebase-realtime-database

#java #firebase #firebase-база данных в реальном времени

Вопрос:

Нужна помощь с firebase. Я читаю документацию и другие темы и не могу найти правильное решение. У меня есть страница чата со списком сообщений. Я хочу ограничить количество загружаемых сообщений 50 сообщениями (поэтому я использую .limitToLast(50)). Проблема в том, что я хочу дать своим пользователям возможность скрывать сообщения от грубых людей в чате. Их сообщения удаляются, код работает, но количество загруженных сообщений становится 50- (количество удаленных сообщений). Я хочу исправить это количество загруженных «обычных» сообщений до 50, даже если перед ними 1000 «плохих» сообщений. Как я могу этого добиться? Спасибо!

   mDatabase = FirebaseDatabase.getInstance().getReference().child("Users").child(current_uid).child("blocked");
  listener = new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                final Message new_message = dataSnapshot.getValue(Message.class);
                final String rude_message_userId = new_message.getUserID();
                mDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot snapshot) {
                        if (snapshot.hasChild(rude_message_userId)) {messageList.remove(new_message);}
                    }
                    @Override
                    public void onCancelled(@NonNull DatabaseError error) {
                    }
                });
                messageList.add(new_message);
            }
            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {}

            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {
            }

            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String s) {}

            @Override
            public void onCancelled(DatabaseError databaseError) {}
        };

        
            query = FirebaseDatabase.getInstance().getReference().child("the_messages").limitToLast(50);
            query.addChildEventListener(listener);
  

Ответ №1:

Как насчет добавления счетчика к вашему оператору if, который проверяет наличие грубых сообщений:

        mDatabase = FirebaseDatabase.getInstance().getReference().child("Users").child(current_uid).child("blocked");
int counter = 0;
      listener = new ChildEventListener() {
                @Override
                public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                    final Message new_message = dataSnapshot.getValue(Message.class);
                    final String rude_message_userId = new_message.getUserID();
                    mDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot snapshot) {
                            if (snapshot.hasChild(rude_message_userId)) {messageList.remove(new_message); counter  ;}
                    }
  

затем установите OnCompletionListener для вашего запроса и снова выполните запрос, ограничившись вашей переменной counter:

     query.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<QuerySnapshot> task){
query2 = FirebaseDatabase.getInstance().getReference().child("the_messages").limitToLast(counter);
query2.get();
counter =0;
  

Комментарии:

1. Тревор, спасибо за твой ответ! Я пробовал что-то вроде этого, но дело в том, что если есть 10 плохих сообщений, то во втором диапазоне будет 60 сообщений, и есть вероятность, что среди 60-50 будут плохие сообщения, что заставляет нас делать третий запрос и, возможно, четвертый … кажется, это не оченьхорошо для интернет-трафика, делая такое количество запросов в любое время для всех пользователей…