Firestore: как можно читать данные извне void onComplete методами - PullRequest
0 голосов
/ 01 мая 2018

Я читаю данные из Cloud Firestore:

      firestoreDB.collection("events")
                .whereEqualTo("type", eventType)
                .get()
                .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
                        if (task.isSuccessful()) {
                           List<Event> eventList = new ArrayList<>();

                           for(DocumentSnapshot doc : task.getResult()){
                              Event e = doc.toObject(Event.class);
                              e.setId(doc.getId());
                               eventList.add(e);
                           }
               //do something with list of pojos retrieved

                        } else {
                            Log.d(TAG, "Error getting documents: ", task.getException());
                        }
                    }
 }); 

Поскольку onComplete является пустым методом, как я могу получить eventList из внешних методов?

Например, я попробовал:

List<Event> ReadCollection()
{
   final List<Event> eventList = new ArrayList<>();
firestoreDB.collection("events")
                    .whereEqualTo("type", eventType)
                    .get()
                    .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                        @Override
                        public void onComplete(@NonNull Task<QuerySnapshot> task) {
                            if (task.isSuccessful()) {
                               List<Event> eventList = new ArrayList<>();

                               for(DocumentSnapshot doc : task.getResult()){
                                  Event e = doc.toObject(Event.class);
                                  e.setId(doc.getId());
                                   eventList.add(e);
                               }
                   //do something with list of pojos retrieved

                            } else {
                                Log.d(TAG, "Error getting documents: ", task.getException());
                            }
                        }
     }); 

return eventList;
}

Это не работает, так как onComplete - метод void. Я ничего не могу прочитать из Cloud Firestore.

1 Ответ

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

Вы не можете вернуть то, что еще не было загружено. Метод onComplete() имеет асинхронное поведение, что означает, что он вызывается еще до того, как вы пытаетесь добавить эти объекты типа Event в eventList ArrayList. Вот почему ваш список всегда пуст за пределами этого метода. Другими словами, к тому времени, когда вы возвращаете eventList, данные еще не закончили загрузку из базы данных, поэтому для решения этой проблемы вам нужно создать свой собственный обратный вызов, чтобы дождаться данных. Итак, сначала вам нужно создать такой интерфейс:

public interface MyCallback {
    void onCallback(List<Event> eventList);
}

Затем вам нужно создать метод, который на самом деле получает данные из базы данных. Этот метод должен выглядеть следующим образом:

public void readData(MyCallback myCallback) {
    firestoreDB.collection("events")
        .whereEqualTo("type", eventType)
        .get()
        .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                if (task.isSuccessful()) {
                    List<Event> eventList = new ArrayList<>();

                    for(DocumentSnapshot doc : task.getResult()) {
                        Event e = doc.toObject(Event.class);
                        e.setId(doc.getId());
                        eventList.add(e);
                    }
                    myCallback.onCallback(eventList);
                } else {
                    Log.d(TAG, "Error getting documents: ", task.getException());
            }
        }

     });
}

В конце просто вызовите метод readData() и передайте экземпляр интерфейса MyCallback в качестве аргумента, где бы он вам ни понадобился, например:

readData(new MyCallback() {
    @Override
    public void onCallback(List<Event> eventList) {
        Log.d("TAG", eventList.toString);
    }
});

Это единственный способ использовать eventList вне onComplete() метода. Для получения дополнительной информации, вы также можете посмотреть это видео .

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