Как получить данные из Firebase Firestore? - PullRequest
0 голосов
/ 24 февраля 2020

В этом коде я добавил «Комментарий» в FireStore, это не проблема.

btnAddComment.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                btnAddComment.setVisibility(View.INVISIBLE);
                DocumentReference comment = firestore.collection("Comment").document(postKey);
                String comment_content = editTextComment.getText().toString();
                String uid = currentUser.getUid();
                String uname = currentUser.getDisplayName();
                String uimg = currentUser.getPhotoUrl().toString();
                Comment comm = new Comment(comment_content, uid, uimg, uname);

                comment.set(comm).addOnSuccessListener(new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {
                        showMessage("Добавлено");
                        editTextComment.setText("");
                        btnAddComment.setVisibility(View.VISIBLE);
                    }
                }).addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        showMessage("Не добавлено: " + e.getMessage());
                    }
                });
            }
        });

А вот как это прошить:

private void iniRvComment() {
        RwComment.setLayoutManager(new LinearLayoutManager(this));
        DocumentReference docRef = firestore.collection("Comment").document(postKey);
        docRef.collection("Comment").addSnapshotListener(new EventListener<QuerySnapshot>() {
            @Override
            public void onEvent(@Nullable QuerySnapshot documentSnapshot, @Nullable FirebaseFirestoreException e) {
                if (documentSnapshot != null && !documentSnapshot.getDocuments().isEmpty()) {
                    listComment = new ArrayList<>();
                    List<DocumentSnapshot> documents = documentSnapshot.getDocuments();
                    for (DocumentSnapshot value : documents) {

                        Comment comment = value.toObject(Comment.class);
                        listComment.add(comment);
                    }
                    commentAdapter = new CommentAdapter(getApplicationContext(), listComment);
                    RwComment.setAdapter(commentAdapter);
                }
            }
        });
    }

Я хочу отобразить «Комментарий» Поле с firestore, использующее «postKey» в качестве ключа, но я могу понять, как работает этот код, посмотрел все это на официальном сайте Firebase. У меня есть "Пост" под каждым постом, пользователь оставляет комментарий, проблема в том, что что-то не отображается.

Ответы [ 2 ]

0 голосов
/ 24 февраля 2020

Как я вижу на вашем скриншоте, у вас есть схема, которая выглядит следующим образом:

Firestore-root
    |
    --- Comment (collection)
          |
          --- docId
               |
               --- content: "hfjnncjf"

Если вы хотите получить все Comment объекты, вам нужно использовать только CollectionReference:

CollectionReference commentRef = firestore.collection("Comment");
commentRef.addSnapshotListener(/* ... */);

Что неправильно в вашем коде, так это добавление вызова .collection("Comment") к вашему commentRef объекту. Что вы делаете, вы предполагаете, что у вас есть подколлекция в вашем commentRef документе, что неправильно. У вас нет такой подколлекции.

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

DocumentReference commentRef = firestore.collection("Comment").document(postKey);

Но без итерации, потому что вы получите только один документ.

Редактировать:

Чтобы получить значение вашего свойства content и отслеживать изменения в режиме реального времени, используйте следующие строки: код:

FirebaseFirestore firestore = FirebaseFirestore.getInstance();
DocumentReference commentRef = firestore.collection("Comment").document("ZQMqIrx19fftjO3ZeSzkuEw87MY2");
commentRef.addSnapshotListener(new EventListener<DocumentSnapshot>() {
    @Override
    public void onEvent(@Nullable DocumentSnapshot snapshot, @Nullable FirebaseFirestoreException e) {
        if (e != null) {
            Log.w(TAG, "Listen failed.", e);
            return;
        }

        if (snapshot != null && snapshot.exists()) {
            Log.d(TAG, snapshot.getString("content"));
        }
    }
});

Вывод в вашем logcat будет:

hfjnncjf
0 голосов
/ 24 февраля 2020

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

firestore.collection("Comment").addSnapshotListener(new EventListener<QuerySnapshot>() {
    @Override
    public void onEvent(@Nullable QuerySnapshot documentSnapshot, @Nullable FirebaseFirestoreException e) {
        if (documentSnapshot != null && !documentSnapshot.getDocuments().isEmpty()) {
            listComment = new ArrayList<>();
            List<DocumentSnapshot> documents = documentSnapshot.getDocuments();
            for (DocumentSnapshot value : documents) {

                Comment comment = value.toObject(Comment.class);
                listComment.add(comment);
            }
            commentAdapter = new CommentAdapter(getApplicationContext(), listComment);
            RwComment.setAdapter(commentAdapter);
        }
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...