Firestore:如何从外部的void onComplete方法中读取数据

时间:2018-05-01 00:21:26

标签: java android firebase google-cloud-firestore

我从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是一个void方法,如何从外部方法中获取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 :(得分:1)

您现在无法返回尚未加载的内容。 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()方法的唯一方法。有关更多信息,您还可以查看此 video