Должен ли я использовать DocumentSnapshot, QuerySnapshot или QueryDocumentSnapshot? - PullRequest
3 голосов
/ 10 января 2020

Я использую EventListener вне любого частного метода, чтобы я мог вызвать его позже в моем onStart() методе:

Цель этого слушателя состоит в том, что приложение чата будет отображать, является ли получатель сообщение видел сообщение или нет. Наверное, я мог сделать несколько ошибок.

Объявление ListenerRegistration происходит до того, как метод onCreate ()

ListenerRegistration listenerRegistration;

EventListener (внутри метода onCreate ())

EventListener<DocumentSnapshot> eventListener = new EventListener<DocumentSnapshot>() {
    @Override
    public void onEvent(@Nullable DocumentSnapshot snapshot, @Nullable FirebaseFirestoreException e) {
        if (snapshot != null){
            String recipientId = getIntent().getStringExtra("recipientId");
            Chat chat = snapshot.toObject(Chat.class);
            if (chat.getReceiver().equals(userId) && chat.getSender().equals(recipientId)){
                HashMap<String, Object> hashMap = new HashMap<>();
                hashMap.put("isseen", true);
                FirebaseFirestore.getInstance().collection("chats").document(roomId).collection("messages").add(hashMap);
            }
        }
    }
};

onStart () метод

@Override
protected void onStart() {
    super.onStart();
    listenerRegistration = FirebaseFirestore.getInstance().collection("chats").document(roomId).collection("messages").addSnapshotListener(MessageActivity.this,eventListener);
}

Пожалуйста, посмотрите на EventListener и дайте мне знать, если я должен изменить его на QuerySnapshot или QueryDocumentSnapshot, потому что я использую DocumentSnapshot, и они дают мне предупреждение о том, что метод getReceiver в приемнике событий создаст исключение NullPointerException.

(также некоторая дополнительная информация, которая может или не может быть полезна: - Каждое сообщение хранится в случайно сгенерированном документе внутри «сообщений» сбор)

1 Ответ

0 голосов
/ 10 января 2020

Сообщение об ошибке, о котором вы говорите в отношении getReceiver(), не имеет ничего общего с типом получаемого снимка. На самом деле у вас нет выбора типа снимка - вы должны использовать тот, который вам предоставляет API, для запроса, который вы делаете.

Ошибка около getReceiver() из-за того, что chat может быть нулевым:

Chat chat = snapshot.toObject(Chat.class);

В документации API для toObject () указано, что он может возвращать ноль, если извлеченный документ не существует. Вам нужно проверить этот случай, чтобы ваш код не обрабатывал sh во время выполнения при попытке get() документа, который на самом деле не существует.

Chat chat = snapshot.toObject(Chat.class);
if (chat != null) {
    // you can call methods of chat safely here
}
else {
    // determine what you want to do if the document doesn't exist
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...