【问题标题】:Query FireStore against a List of Documents根据文档列表查询 FireStore
【发布时间】:2019-02-01 15:48:54
【问题描述】:

我有一个List<String> 的名称指的是我想从 FireStore 中检索的文档。我想在加载完成后访问内容,所以我在 Fragment 中实现了一个使用数据的 OnCompleteListener。但是,我不确定如何在 Task 中运行循环来查询每个文档的 FireStore。我在 Repository 类中查询 FireStore,该类通过我的ViewModel 返回一个Task 对象,最后返回我的Fragment。我希望存储库返回 Task,以便我可以将 OnCompleteListener 附加到它,以便知道我何时完成加载数据。

我的仓库Query 方法:

public Task<List<GroupBase>> getGroups(List<String> myGroupTags){
    final List<GroupBase> myGroups = new ArrayList<>();
    for(String groupTag : myGroupTags){
        groupCollection.document(groupTag).get()
                .addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                        if(task.isSuccessful()){
                            myGroups.add(task.getResult().toObject(GroupBase.class));
                        }
                    }
                });
    }
    return null; //Ignore this for now.
}

我知道这不会返回我需要的内容,但我不确定如何构造一个在其中包含循环的 Task。我是否需要在我的Fragment 中提取List&lt;String&gt; 的内容并对每个项目运行单独的查询?

任何建议将不胜感激。

【问题讨论】:

  • 那么你真正需要什么,将字符串列表转换为任务列表?
  • 如果你收集一堆 Task 对象并等待它们全部完成 Tasks.whenAll() 得到一个包含所有结果的单个 Task 会更容易。
  • @AlexMamo 基本上是的。我有一个文档名称列表,我需要将其转换为本质上的任务列表以检索整个文档。嗨,Doug,所以您建议我遍历列表并为每个项目构建一个任务并将单个任务附加到一个新列表中?

标签: java android firebase google-cloud-firestore task


【解决方案1】:

根据您的评论:

我有一个文档名称列表,我需要将其转换为本质上的任务列表以检索整个文档。

要解决这个问题,请使用以下代码行:

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference collRef = rootRef.collection("yourCollection");
List<String> myGroupTags = new ArrayList<>();
List<DocumentReference> listDocRef = new ArrayList<>();
for(String s : myGroupTags) {
    DocumentReference docRef = collRef.document(s);
    listDocRef.add(docRef);
}

List<Task<DocumentSnapshot>> tasks = new ArrayList<>();
for (DocumentReference documentReference : listDocRef) {
    Task<DocumentSnapshot> documentSnapshotTask = documentReference.get();
    tasks.add(documentSnapshotTask);
}
Tasks.whenAllSuccess(tasks).addOnSuccessListener(new OnSuccessListener<List<Object>>() {
    @Override
    public void onSuccess(List<Object> list) {
        //Do what you need to do with your list
        for (Object object : list) {
            GroupBase gb = ((DocumentSnapshot) object).toObject(GroupBase.class);
            Log.d("TAG", tp.getPropertyname);
        }
    }
});

【讨论】:

  • 初始化任务是否执行?我不知道为什么,但我觉得 get() 方法无论如何都会执行它。是这样吗?
  • @JakubKostka 恐怕我听不懂你,但请使用自己的MCVE 发布另一个新问题,以便我和其他 Firebase 开发人员可以帮助你。
猜你喜欢
  • 2018-11-28
  • 1970-01-01
  • 2020-12-12
  • 2021-05-05
  • 2018-07-12
  • 2021-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多