Как работать с ссылочным типом в firestore? - PullRequest
0 голосов
/ 05 мая 2018

У меня следующая Firestore структура документа:

enter image description here

Это вывод

enter image description here

Как вы можете видеть stop, который находится под 12:00PM, отображается под 1:00PM. Я думаю, что это из-за запроса asynchronous. Так как я могу справиться с этим?

На самом деле сначала я получаю документ, затем получаю keys отправления, которые равны times, затем получаем массив stops того времени, теперь снова отправьте запрос на получение имени и города остановки.

Вот код, который я использую для извлечения времени и всех остановок этого времени.

db.collection(DBMeta.COLLECTION_ROUTE)
.document(routeIntent.getId())
.addSnapshotListener(new EventListener<DocumentSnapshot>() {
    @Override
    public void onEvent(@Nullable DocumentSnapshot documentSnapshot,
                        @Nullable FirebaseFirestoreException e) {
        Route route = null;
        if(documentSnapshot!=null)
        route = documentSnapshot.toObject(Route.class);
        if(route != null){
            if(route.getDeparture() != null){
                String[] departures = route.getDeparture().keySet().toArray(new String[route.getDeparture().keySet().size()]);
                for(String time : departures){
                    Object object = route.getDeparture().get(time).get(DBMeta.DOCUMENT_ROUTE_STOPS);
                    ArrayList<DocumentReference> stops = (ArrayList<DocumentReference>)object;
                    departureLayout.addView(timeTextView(time));
                    for(DocumentReference stop : stops){
                        stop.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
                            @Override
                            public void onSuccess(DocumentSnapshot documentSnapshot) {
                                final String bussStop = documentSnapshot.getString(DBMeta.DOCUMENT_STOP_NAME);
                                DocumentReference doc = documentSnapshot.getDocumentReference(DBMeta.DOCUMENT_STOP_CITY);
                                if(doc != null){
                                    doc.get()
                                    .addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
                                        @Override
                                        public void onSuccess(DocumentSnapshot documentSnapshot) {
                                            String cityAbbrev = documentSnapshot.getString(DBMeta.DOCUMENT_CITY_ABBREV);
                                            departureLayout.addView(stopTextView(bussStop + " - " + cityAbbrev));
                                        }
                                    });
                                }
                            }
                        });
                    }
                }
            }
        }
    }
});

1 Ответ

0 голосов
/ 07 мая 2018

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

db.collection(DBMeta.COLLECTION_ROUTE).document(routeIntent.getId()).get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
        if (task.isSuccessful()) {
            DocumentSnapshot document = task.getResult();
            if (document.exists()) {
                Map<String, Object> map = document.getData();
                Map<String, Object> departureMap = (Map<String, Object>) map.get("departure");
                for (Map.Entry<String, Object> entry : departureMap.entrySet()) {
                    Log.d(TAG, entry.getKey());
                    Map<String, Object> innerMap = (Map<String, Object>) entry.getValue();
                    for (Map.Entry<String, Object> e : innerMap.entrySet()) {
                        Log.d(TAG, e.getValue().toString());
                    }
                }
            }
        }
    }
});

Вывод будет:

12:00 PM
ByPass - GRW
1:00 PM
Jail Chowk - GRT

Не используйте addSnapshotListener, если только вам не нужны обновления в реальном времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...