根据文档列表查询FireStore

时间:2019-02-01 15:48:55

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

我有一个List<String>的名字,它指向我要从FireStore检索的文档。内容加载完成后,我想访问其中的内容,因此我在使用数据的OnCompleteListener中实现了Fragment。但是,我不确定如何在Task中运行循环来查询FireStore的每个文档。我在Repository类中查询FireStore,该类通过我的Task返回一个ViewModel对象,最后返回到我的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并在其中包含循环。我是否需要提取List<String>Fragment的内容并对每个项目运行单独的查询?

任何建议将不胜感激。

1 个答案:

答案 0 :(得分: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);
        }
    }
});