gpt4 book ai didi

java - Firestore : how can read data from outside void onComplete methods

转载 作者:行者123 更新时间:2023-11-29 23:59:10 26 4
gpt4 key购买 nike

我从 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 是一个无效方法。我无法从 Cloud Firestore 读取任何内容。

最佳答案

您现在无法返回尚未加载的内容。 onComplete() 方法具有异步行为,这意味着即使在您尝试将那些类型为 Event 的对象添加到 eventList 之前,它也会被调用数组列表。这就是为什么你的列表在该方法之外总是空的。换句话说,当你返回 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 接口(interface)的实例作为参数传递给任何需要的地方,如下所示:

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

这是您可以在 onComplete() 方法之外使用 eventList 的唯一方法。有关更多信息,您还可以查看此 video .

关于java - Firestore : how can read data from outside void onComplete methods,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50109885/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com