Firebase Query - как сделать заказ по отдельному полю? - PullRequest
0 голосов
/ 09 мая 2018

Я работаю с приложением Android, которое функционирует в качестве службы мгновенных сообщений, и я собираюсь вытащить данные сообщения в RecyclerView. У меня есть объект Firebase Query, возвращающий все сообщения, которые соответствуют id загруженного чата, это делается так:

Query qChatMessages = mDbRefMessages
    .orderByChild("messageChat")
    .equalTo(mChatId);

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

Мои message узлы в базе данных имеют ассоциированное с ними поле messageTimestamp, поэтому я бы хотел отсортировать данные. Проблема в том, что мне кажется, что я не могу найти способ упорядочить данные по какому-либо полю, кроме того, к которому я обращаюсь, или получить результаты обратно из Firebase и затем упорядочить их.

Кто-нибудь знает, как я могу обойти это, или есть какие-то возможности Firebase, о которых я не знаю?

Заранее спасибо,

Mark

1 Ответ

0 голосов
/ 09 мая 2018

Самый простой способ - сохранить дополнительный фрагмент данных в ваших message узлах, то есть времени эпохи, умноженном на -1: таким образом вы можете отсортировать это поле, и запрос вернет правильный порядок.

См. Этот пост о том, как получить время эпохи: как узнать количество секунд, прошедших с 1970 года для значения даты?


Однако обратите внимание, что с вашей текущей структурой данных вы столкнетесь с проблемой: вам нужно будет отсортировать эти новые данные (например, с помощью .orderByChild("messageCreationTime")) И фильтр для данного mChatId (например, с equalTo(mChatId)), который невозможно.

Итак, вам придется реструктурировать базу данных (если это возможно) следующим образом:

- messages
   - mChatId
      - messageUniqueID  <- most probably auto-generated by Firebase
        - messageTitle: ....
        - messageCreationTime: -1525857044

И вы бы запросили:

Query qChatMessages = databaseReference.child("messages").child(mChatId)
        .orderByChild("messageCreationTime");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...