首页 > 解决方案 > 如何跟踪所有查询是否在 Firestore (Android) 中完成?

问题描述

我有一个Posts集合,其中每个文档都有这些字段userId, postImage, uploadTime ...

我想使用集合字段 从集合中获取用户( userName, userImage)的信息并将其与UsersuserIdPostsPostModel


public class PostModel {

    private String userId;

    private String userName;

    private String userImage;

    private String postImage;

    private long likeCount;

    private long dislikeCount;

    private Timestamp uploadTime;

    public PostModel() {
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserImage() {
        return userImage;
    }

    public void setUserImage(String userImage) {
        this.userImage = userImage;
    }

    public String getPostImage() {
        return postImage;
    }

    public void setPostImage(String postImage) {
        this.postImage = postImage;
    }

    public long getLikeCount() {
        return likeCount;
    }

    public void setLikeCount(long likeCount) {
        this.likeCount = likeCount;
    }

    public long getDislikeCount() {
        return dislikeCount;
    }

    public void setDislikeCount(long dislikeCount) {
        this.dislikeCount = dislikeCount;
    }

    public Timestamp getUploadTime() {
        return uploadTime;
    }

    public void setUploadTime(Timestamp uploadTime) {
        this.uploadTime = uploadTime;
    }
}

目前,这就是我查询的方式,但我无法跟踪是否所有请求获取与完成Users相关的每个文档Posts

seepakDatabase.collection(COLLECTION_POSTS).orderBy(SORT, Query.Direction.DESCENDING).limit(LIMIT).get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {

            @Override
            public void onSuccess(QuerySnapshot queryDocumentSnapshots) {

                // Clearing the previous data of the lists if any.
                postModelList.clear();

                if (queryDocumentSnapshots.getDocuments().size() < LIMIT) {

                    setNoMoreData(true);

                } else {

                    setNoMoreData(false);

                    lastDocumentSnapshot = queryDocumentSnapshots.getDocuments().get(queryDocumentSnapshots.size() - 1);

                }

                for (QueryDocumentSnapshot queryDocumentSnapshot : queryDocumentSnapshots) {

                    final PostModel postModel = queryDocumentSnapshot.toObject(PostModel.class);


                    String userId = postModel.getUserId();

                   // How to know if all the queries made here completed?

                    seepakDatabase.collection(COLLECTION_USERS).document(userId).get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
                        @Override
                        public void onSuccess(DocumentSnapshot documentSnapshot) {

                            postModel.setUserName(documentSnapshot.getString("userName"));

                            postModel.setUserImage(documentSnapshot.getString("userImage"));

                            postModelList.add(postModel);
                        }
                    });

                }

                // Hiding the swipe refresh progress bar if visible.
                postsSwipeRefresh.setRefreshing(false);

                // Hiding progress bar when lists populate if visible.
                postFetch.setVisibility(View.GONE);

                // Notifying adapter to load new data in recycler view.
                feedAdapter.notifyDataSetChanged();

            }
        });

更新 1


                List<Task<DocumentSnapshot>> tasks = new ArrayList<>();

                for (QueryDocumentSnapshot queryDocumentSnapshot : queryDocumentSnapshots) {

                    final PostModel postModel = queryDocumentSnapshot.toObject(PostModel.class);

                    Task<DocumentSnapshot> documentSnapshotTask = seepakDatabase.collection(COLLECTION_USERS).document(postModel.getUserId()).get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
                        @Override
                        public void onSuccess(DocumentSnapshot documentSnapshot) {
                            postModel.setUserName(documentSnapshot.getString("userName"));
                            postModel.setUserImage(documentSnapshot.getString("userImage"));

                            postModelList.add(postModel);
                        }
                    });

                    tasks.add(documentSnapshotTask);

                }

                Tasks.whenAllSuccess(tasks).addOnSuccessListener(new OnSuccessListener<List<Object>>() {
                    @Override
                    public void onSuccess(List<Object> objects) {

                        // Hiding the swipe refresh progress bar if visible.
                        postsSwipeRefresh.setRefreshing(false);

                        // Hiding progress bar when lists populate if visible.
                        postFetch.setVisibility(View.GONE);

                        // Notifying adapter to load new data in recycler view.
                        feedAdapter.notifyDataSetChanged();

                    }
                });

标签: javaandroidfirebasegoogle-cloud-firestore

解决方案


Query 的get()方法返回一段Task<QuerySnapshot>时间 DocumentReference 的get()返回Task<DocumentSnapshot>。因为QueryDocumentSnapshot扩展DocumentSnapshot,所以将每次迭代中的 Task 对象添加到列表中。最后,只需将该列表传递给 Tasks 的whenAllSuccess(Collection> tasks)方法,正如我在以下帖子中的回答中所解释的那样:

这样,您将知道何时获得所有文件。


推荐阅读