Android - Запрос всех документов из вложенной коллекции как объектов - База данных Firestore в реальном времени - PullRequest
1 голос
/ 15 мая 2019

У меня есть класс модели Appointment, который имеет тип как поле, Мне нужно прослушать и получить все документы из его subCollection в базе данных реального времени Firestore ,Логика загрузки работает отлично, но так как я практически впервые захожу в пожарный магазин, у меня возникают некоторые проблемы с получением данных.

после получения документов Мне нужно разделить их по типу (Назначение type_A, Назначение type_B)

Это то, чего я добился до сих пор, но, кажется, я не могу пройти мимо этого!

PS.Приведенный ниже код в основном основан на документации Firebase!

@Override
public void onStart() {
    super.onStart();
    //get all appointments
    mFirestore.collection("reporters").document(mUser.getUid()).collection("appointments")
            .addSnapshotListener(new EventListener<QuerySnapshot>() {
                @Override
                public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
                    mFirestore.collection("reporters").document().collection("appointments")
                            .whereEqualTo("type", "typeB")
                            .addSnapshotListener(new EventListener<QuerySnapshot>() {
                                @Override
                                public void onEvent(@Nullable QuerySnapshot value,
                                                    @Nullable FirebaseFirestoreException e) {
                                    if (e != null) {
                                        Toast.makeText(getActivity(), "listen failed", Toast.LENGTH_SHORT).show();
                                        return;
                                    }

                                    for (QueryDocumentSnapshot doc : value) {
                                        if (doc.get("name") != null) {
                                            v_appointmentsList.add(doc.toObject(Appointment.class));
                                        }
                                    }
                                }
                            });
                    mFirestore.collection("reporters").document().collection("appointments")
                            .whereEqualTo("type", "typeA")
                            .addSnapshotListener(new EventListener<QuerySnapshot>() {
                                @Override
                                public void onEvent(@Nullable QuerySnapshot value,
                                                    @Nullable FirebaseFirestoreException e) {
                                    if (e != null) {
                                        Toast.makeText(getActivity(), "listen failed", Toast.LENGTH_SHORT).show();
                                        return;
                                    }

                                    for (QueryDocumentSnapshot doc : value) {
                                        if (doc.get("name") != null) {
                                            p_appointmentsList.add(doc.toObject(Appointment.class));
                                        }
                                    }
                                }
                            });
                    //get all docs
                    //....
                    //sort by date [max -> min || min -> max]
                    //...
                    //get index [0] || index [last]
                    //...
                    //if it is vax then affect to variables v_
                    //if it is ped then affect to variables p_
                }
            });
}

1 Ответ

1 голос
/ 15 мая 2019

Для вашего случая я предлагаю вам сделать следующее (я основал этот ответ на комментариях ниже), для подобных случаев использование базы данных в реальном времени не критично, и вы можете попробовать использовать этот метод вместо этого:

//colRef is a reference/path to your collection
//filter by type with .whereEqualTo("field", "type")


colRef.whereEqualTo("type", "yourType")
            .get()
            .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task) {
                    if (task.isSuccessful()) {
                        for (QueryDocumentSnapshot document : Objects.requireNonNull(task.getResult())) {
                            //add to your arraylist
                        }
                    } else {
                        Toast.makeText(getContext(), "fail to get docs", Toast.LENGTH_SHORT).show();
                    }
                }
            });


//repeat the process for the second type
//if you have more types I suggest using another approach
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...