java - 如何跟踪所有查询是否在 Firestore (Android) 中完成?
问题描述
我有一个Posts
集合,其中每个文档都有这些字段userId, postImage, uploadTime ...
我想使用集合字段 从集合中获取用户( userName, userImage
)的信息并将其与Users
userId
Posts
PostModel
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();
}
});
解决方案
Query 的get()方法返回一段Task<QuerySnapshot>
时间 DocumentReference 的get()返回Task<DocumentSnapshot>
。因为QueryDocumentSnapshot扩展DocumentSnapshot,所以将每次迭代中的 Task 对象添加到列表中。最后,只需将该列表传递给 Tasks 的whenAllSuccess(Collection> tasks)方法,正如我在以下帖子中的回答中所解释的那样:
这样,您将知道何时获得所有文件。
推荐阅读
- django - 如何在使用 serailizer 验证和 APIViews 时避免冗余数据库查询
- javascript - 错误:SequelizeUniqueConstraintError:验证错误
- mysql - 删除字符串样式=";" 带有特殊字符的 sql phpmyadmin
- jhipster - Jhipster 将前端与后端分开部署
- php - 如何找出调用我的 php 文件的内容
- python - 如何使用分类数据和数据框进行预处理
- python - 所以我在文本文档中列出了单词列表,并在按下按钮后更新。单词随机显示
- node.js - 我如何在 mongodb 和 mongoose 中实现这一点
- c - 使用 fgets() 计算子字符串在字符串中出现的次数(C)
- sql - 在 mvc 的 list1 中找到 list2