Как запросить поле документа внутри queryDocumentSnapshot Firestore - PullRequest
0 голосов
/ 22 марта 2020

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

Вот так выглядит моя архитектура Firestore:

enter image description here

И мой код на данный момент:

 CollectionReference chatRoomMsgs = db.collection("chatrooms").document(chatRoomID).collection("Messages");
    chatRoomMsgs.get()
            .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
                @Override
                public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                    for(QueryDocumentSnapshot documentSnapshot: queryDocumentSnapshots){
                        if(documentSnapshot.get("sentby") == firebaseUser.getUid()){

                        }
                    }
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {

                }
            });

То, что я (в настоящее время) пытаюсь сделать, это сначала извлечь ВСЕ сообщения чата, а затем отделить их в onSuccess .

Я пытаюсь сказать "хорошо, если сообщение было отправлено этим пользователем, возьмите значение поля изображения этого же документа и добавьте его в массив, чтобы к нему можно было получить доступ позже, и если сообщение не был отправлен тем же пользователем, также захватите URL изображения, но добавьте его в другой массив "

Как я могу это сделать? Спасибо!

Обновление Я пытался добавить ниже значение while l oop, чтобы получить какой-то вывод, не вызывая

ArrayList<String> sentPics = new ArrayList<String>();      
while(documentSnapshot.get("sentby") == firebaseUser.getUid()){
                                    sentPics.add(documentSnapshot.get("image").toString());
                                    Log.d("PICLIST", sentPics.toString());
                                }

Ответы [ 2 ]

1 голос
/ 23 марта 2020

Если вы хотите получить все сообщения, отправленные указанным пользователем c, вам следует использовать следующий запрос:

CollectionReference chatRoomMsgs = db.collection("chatrooms").document(chatRoomID).collection("Messages");
Query sendByQuery = chatRoomMsgs.whereEqualTo("sentby", firebaseUser.getUid());
sendByQuery.addOnSuccessListener(/* ... */);

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

Ваше решение очень дорогое, потому что вы получаете все сообщения, которые есть в коллекции Messages, и фильтруете их на клиенте. , Если у вас в коллекции 100 сообщений, но только 10 соответствуют зарегистрированному пользователю, с вас будет взято 100 чтений. В моем решении вы будете платить только 10, так как запрос возвращает только 10 сообщений.

Если вы хотите увидеть другой подход, здесь вы можете найти учебное пособие по созданию полного и функционального Firestore Chat App .

0 голосов
/ 22 марта 2020

Что вам нужно сделать, это создать POJO с именем Message, который отображается в вашу коллекцию сообщений с переменными-членами image и sentby и преобразовать documentSnapshot в Message объект, используя:

Message message = documentSnapshot.toObject(Message.class)

С этого момента вы можете просто использовать геттеры для достижения того, что вы хотите.

Надеюсь, это поможет!

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