как читать подсборку firestore и передавать ее в FirestoreRecyclerOptions - PullRequest
0 голосов
/ 25 декабря 2018

enter image description here У меня есть база данных firestore с корневыми продуктами, и у каждого продукта есть коллекция «комментариев», поэтому я сохранил в ней комментарии всех пользователей об этом продукте, но когда я получаю запрос на эту подколлекцию комментариев, я получаюнулевые значения или ноль снимков из магазина

   private void getCommentObject(){



    query = FirebaseFirestore.getInstance()
            .collection("products").document(docID).collection("comments");

    FirestoreRecyclerOptions<CommentModel> options = new FirestoreRecyclerOptions.Builder<CommentModel>()
            .setQuery(query, CommentModel.class)
            .build();


    adapter = new FirestoreRecyclerAdapter<CommentModel, commentHolder>(options) {
        @NonNull
        @Override
        public commentHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.comment_item_layout, parent, false);

            return new commentHolder(view);
        }

        @Override
        protected void onBindViewHolder(@NonNull commentHolder commentHolder, int position, @NonNull CommentModel commentModel) {


            commentHolder.full_comment.setText(String.valueOf(commentModel.getComment()));
            commentHolder.comment_date.setText(String.valueOf(commentModel.getCommentDate()));
            commentHolder.comment_user.setText(String.valueOf(commentModel.getCommentUser()));


            Glide.with(getApplicationContext())
                    .load(commentModel.getProfilePic())
                    .into(commentHolder.userProfileImg);

        };

    };



    rv.setAdapter(adapter);
    adapter.notifyDataSetChanged();

}

и вот мой комментарийModel calss

@IgnoreExtraProperties

открытый класс CommentModel реализует Serializable {

public CommentModel() {
}


String comment ,  commentDate , profilePic , commentUser ;

public CommentModel(String comment) {
    this.comment = comment;
}

public String getComment() {
    return this.comment;
}

public void setComment(String Comment) {
    this.comment = comment;
}

public String getCommentDate() {
    return this.commentDate;
}

public void setCommentDate(String commentDate) {
    commentDate = commentDate;
}

public String getProfilePic() {
    return profilePic;
}

public void setProfilePic(String profilePic) {
    this.profilePic = profilePic;
}

public String getCommentUser() {
    return commentUser;
}

public void setCommentUser(String commentUser) {
    commentUser = commentUser;
}

}

enter image description here

1 Ответ

0 голосов
/ 27 декабря 2018

Проблема в вашем коде заключается в том, что имена полей в вашем классе CommentModel отличаются от имен свойств в вашей базе данных.В вашем классе CommentModel есть поле с именем comment, но в вашей базе данных я вижу его как Comment, и это неверно.Имена должны совпадать.Когда вы используете метод получения с именем getComment(), Firebase ищет в базе данных поле с именем comment, а не Comment.См. Строчную c букву против заглавной буквы C?

Существует два способа решения этой проблемы.Первым из них будет изменение класса модели путем переименования полей в соответствии с Java Naming Conventions .Таким образом, ваш класс модели должен выглядеть следующим образом:

public class CommentModel {
    private String comment, commentDate, profilePic, commentUser;

    public CommentModel() {}

    public CommentModel(String comment, String commentDate, String profilePic, String commentUser) {
        this.comment = comment;
        this.commentDate = commentDate;
        this.profilePic = profilePic;
        this.commentUser = commentUser;
    }

    public String getComment() { return comment; }
    public String getCommentDate() { return commentDate; }
    public String getProfilePic() { return profilePic; }
    public String getCommentUser() { return commentUser; }
}

Смотрите в этом примере, есть private поля и открытые методы получения.Существует также более простое решение - установить значение непосредственно в открытых полях, например так:

public class CommentModel {
    public String comment, commentDate, profilePic, commentUser;
}

Теперь просто удалите текущие данные и добавьте их снова, используя правильные имена.Это решение будет работать, только если вы находитесь на этапе тестирования.

Существует также второй подход, который заключается в использовании annotations.Поэтому, если вы предпочитаете использовать частные поля и общедоступные методы получения, вы должны использовать аннотацию PropertyName только перед объектом получения.Итак, ваш CommentModel класс должен выглядеть следующим образом:

public class CommentModel {
    private String comment, commentDate, profilePic, commentUser;

    public CommentModel() {}

    public CommentModel(String comment, String commentDate, String profilePic, String commentUser) {
        this.comment = comment;
        this.commentDate = commentDate;
        this.profilePic = profilePic;
        this.commentUser = commentUser;
    }

    @PropertyName("Comment")
    public String getComment() { return comment; }
    @PropertyName("CommentDate")
    public String getCommentDate() { return commentDate; }
    @PropertyName("ProfilePic")
    public String getProfilePic() { return profilePic; }
    @PropertyName("CommentUser")
    public String getCommentUser() { return commentUser; }
}

Не забудьте также начать прислушиваться к изменениям.

PS В вашем классе это должно быть:

this.commentDate = commentDate;

а не:

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