Как отсортировать карту Firebase DocumentReferences по дате? - PullRequest
0 голосов
/ 21 июня 2020

Я пытаюсь создать небольшое приложение для чата с использованием облака Firebase. Я создал следующую структуру в базе данных Firebase:

Collection "users" -> bob@gmail.com document -> map of "chat rooms" field (type Map<String, DocumentReference>)
Collection chatRooms -> room id document -> Collection messages -> message id document -> fields

message id document содержит следующие поля:

from: the user that sent the message
message: the text of the mesasage
sentAt: Date

Я хочу создать RecyclerView всех чатов текущий пользователь. Итак, что я сделал:

FireDB.collection("users").document(connectedEmail).get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
    @Override
    public void onSuccess(DocumentSnapshot documentSnapshot) {
        Log.d(this.getClass().getName(), "addOnSuccessListener:success");
        if (!(documentSnapshot.exists())) {
            // TODO
            return;
        }
        Map<String, DocumentReference> chatRooms = (Map<String, DocumentReference>) documentSnapshot.get("chatRooms");
        if (chatRooms.isEmpty()) {
            // TODO
            return;
        }
    }
}).addOnFailureListener(new OnFailureListener() {

    @Override
    public void onFailure(@NonNull Exception e) {
        Log.d(this.getClass().getName(), "addOnSuccessListener:failed");
    }
});

Каким будет самый простой путь к карте чата по дате последнего сообщения? Я думал сохранить на уровне room id document последний раз, когда этот документ был затронут, но я хочу знать, можно ли использовать Firebase без добавления специальной поддержки.

1 Ответ

1 голос
/ 21 июня 2020

Да, вам нужно обновлять документ комнаты чата всякий раз, когда отправляется сообщение, Firebase Firestore не добавляет автоматически метку времени к записи.

Допустим, у вас есть поле «updated_at» (время в метке времени) внутри документа комнаты, всякий раз, когда в эту комнату отправляется сообщение, вам просто нужно обновить его с помощью последней отметки времени. Тогда вы можете расположить все комнаты в определенном порядке.

Зачем экономить время в Timestamp?

Firebase рекомендует это. Легче запрашивать документы, используя НАПРАВЛЕНИЕ в порядке По Может быть легко преобразовано в любое отображение даты без особого кода

Пример реализации

  FirebaseFirestore.getInstance().collection("YOUR_COLLECTION") 
                .whereEqualTo("your_key", "your_value")
                .orderBy("lastUpdateTime", Query.Direction.DESCENDING)
                .addSnapshotListener(new EventListener<QuerySnapshot>() {
        @Override
        public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
            if (queryDocumentSnapshots != null) {
                if (!queryDocumentSnapshots.isEmpty()) {

                 //DATA returned, You can use Gson to convert them to your POJO list

                } else {

                    //NO DATA RETURNED

                }

            }
        }
    });
...