Как правильно переписать код с Firebase в облачном Firestore? - PullRequest
0 голосов
/ 04 марта 2020

Я написал для подключения к Firebase, и теперь я хочу перенести все в облако Firestore 1) первый метод написан, чтобы получить «Комментарий» из Firebase

private void iniRvComment() {
        RvComment.setLayoutManager(new LinearLayoutManager(this));
        DatabaseReference commentRef = firebaseDatabase.getReference(COMMENT_KEY).child(postKey);
        commentRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                listComment = new ArrayList<>();
                for(DataSnapshot snapshot: dataSnapshot.getChildren()){
                    Comment comment = snapshot.getValue(Comment.class);
                    listComment.add(comment);
                }
                commentAdapter = new CommentAdapter(getApplicationContext(), listComment);
                RvComment.setAdapter(commentAdapter);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }

2) и как переписать этот код получить «Комментарий» из облачного пожарного магазина. То, что я написал ниже, неверно

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);
                }
            }
        });
    }

enter image description here

Ответы [ 2 ]

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

Комментарий в вашем collection, который содержит несколько документов, которые являются вашими комментариями. Так что просто передайте имя коллекции, это поможет вам получить остальные данные самостоятельно.

private void iniRvComment() {
        RwComment.setLayoutManager(new LinearLayoutManager(this));
        DocumentReference docRef = firestore.collection("Comment");
        docRef.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);
                }
            }
        });
    }
0 голосов
/ 04 марта 2020

Я рекомендую объединить ваши комментарии в одну коллекцию верхнего уровня Comments, а не хранить их под постом. Это позволит вам выполнять множество полезных операций поиска, таких как поиск по всем комментариям по пользователю или сообщению или даже создание канала «недавно активных сообщений».

Для этого вам необходимо изменить структуру базы данных таким образом, чтобы что все комментарии хранятся вместе с постом, к которому они прикреплены.

{
  content: "...",
  timestamp: 1234534568425,
  postId: "...",
  uid: "...",
  uimg: "...",
  uname: "..."
}

После того, как вы это сделали, теперь вы можете запрашивать комментарии по почте, используя:

private final int PAGE_SIZE = 10;
private void iniRvComment() {
  RvComment.setLayoutManager(new LinearLayoutManager(this));

  firestore.collection("Comments") // this is a top level collection
    .whereEqualTo("postId", postKey) // select comments for given post
    .orderBy("timestamp", Query.Direction.DESCENDING) // order newest to oldest
    .limit(PAGE_SIZE) // fetch up to PAGE_SIZE recent comments
    .addSnapshotListener(new EventListener<QuerySnapshot>() {
      @Override
      public void onEvent(@Nullable QuerySnapshot results,
                          @Nullable FirebaseFirestoreException e) {
        if (e != null) {
          Log.w(TAG, "Listen failed.", e);
          return;
        }

        listComment = new ArrayList<>(PAGE_SIZE);
        for (QueryDocumentSnapshot commentDoc : results) {
          Comment commentObj = commentDoc.toObject(Comment.class);
          listComment.add(commentObj);
        }

        commentAdapter = new CommentAdapter(getApplicationContext(), listComment);
        RvComment.setAdapter(commentAdapter);
        Log.d(TAG, "Retrieved " + results.size() + " recent comments.");
      }
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...