Запрос FireStore к списку документов - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть List<String> имен, относящихся к документам, которые я хочу получить из FireStore.Я хочу получить доступ к содержимому после завершения загрузки, поэтому я реализовал OnCompleteListener в Fragment, который использует данные.Однако я не уверен, как запустить цикл внутри Task, чтобы запросить FireStore для каждого документа.Я запрашиваю FireStore в классе Repository, который возвращает объект 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 голосов
/ 01 февраля 2019

Согласно вашему комментарию:

У меня есть список имен документов, и мне нужно преобразовать его в список задач для получения всего документа.

Чтобы решить эту проблему, используйте следующие строки кода:

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);
        }
    }
});
...