#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 будут плохие сообщения, что заставляет нас делать третий запрос и, возможно, четвертый … кажется, это не оченьхорошо для интернет-трафика, делая такое количество запросов в любое время для всех пользователей…