Проблема в том, что вы используете массив - они не могут быть переупорядочены и очень сложны для использования в базе данных NoSQL, поскольку элементы не могут быть изменены в пределах области действия массива. Обычно (почти всегда) есть гораздо лучшие варианты структурирования и хранения ваших данных.
Короче говоря, у массива в коде может быть удален индекс, а объект со следующим индексом «движется вверх» и заполняет это место,Аналогично, объекты могут быть вставлены в массив, и следующие элементы «перемещаются вниз».
Массивы в Firebase не работают таким образом;чтобы внести изменения в порядок, количество и т. д., весь массив должен быть прочитан в обновленном, а затем записан обратно - отсюда запускается множество событий, как упомянуто в моих комментариях.
См. этот устаревший, но точечный блог массивы злые и дальнейшее чтение здесь
Вы должны изменить свою структуру;
user_chats
uid_0
random_chat_id_0 //created with .childByAutoId
timestamp: 20191020
unread_messags: 3
user_id: uid_1 //don't use -> user_name: "some username"
random_chat_id_1
timestamp: 20191021
unread_messags: 3
user_id: uid_4
.childByAutoId - ваш друг, и я обычно рекомендую использоватьэто для создания любого вида ключа узла, который должен быть уникальным.
Другое предложение - избегать имен пользователей;используйте UID пользователей. Имена пользователей часто бывают динамическими, но идентификаторы пользователей являются статическими и привязаны к этому конкретному пользователю.
Последнее;функция addChatChangeListener
это не то. Есть два разных наблюдателя запросов .childChanged
и .childMoved
, и их функции очень разные. Я бы предложил переименовать функцию на addChatMovedLister
, чтобы избежать путаницы или изменить код внутри функции для фактической обработки .childChanged
событий.