java - 使用 FireBase/FireStore 访问 Java 内部函数中的数据
问题描述
我正在使用 Google 的 FireStore 后端编写一个 android 应用程序。获取firestore集合中所有文档的代码如下,来自官方文档:
db.collection("cities")
.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document : task.getResult()) {
Log.d(TAG, document.getId() + " => " + document.getData());
}
} else {
Log.d(TAG, "Error getting documents: ", task.getException());
}
}
});
在上面的代码输出到的地方Log.d(...)
,我想让我的程序将document.getData()
调用结果添加到ArrayList
内部类/方法之外的可访问对象。我不确定这样做的最佳方法是什么。尝试更改方法的返回类型会onComplete
产生错误。在这样的方法中是否有访问元素的标准方法?
声明一个变量并尝试在类中改变也是不可能的,除非变量是最终的,这违背了这一点。
解决方案
我想让我的程序将 document.getData() 调用的结果添加到内部类/方法外部可访问的 ArrayList。
在这种情况下,如果您使用的是模型类,您应该使用toObject()
方法并添加如下类型YourModelClass
的对象ArrayList
:
if (task.isSuccessful()) {
List<YourModelClass> list = new ArrayList<>();
for (QueryDocumentSnapshot document : task.getResult()) {
YourModelClass yourModelClass = document.toObject(YourModelClass.class);
list.add(yourModelClass);
//Do what you need to do with your list
}
}
如您所见,我建议您YourModelClass
在回调中使用对象列表。这是因为onComplete()
方法具有异步行为,您不能简单地在回调之外使用该列表,因为它始终为空。
尝试更改 onComplete 方法的返回类型会产生错误。
更改方法的返回类型不会给您错误,但结果将始终是一个空列表。您现在无法退回尚未加载的内容。解决此问题的一个快速方法是仅在onComplete()
方法内部使用该对象列表,正如我在上面已经写过的那样,或者如果您想在外部使用它,我建议您从这篇文章中查看我的答案的最后一部分,我在其中已经解释了如何使用自定义回调来完成。您也可以观看此视频以更好地理解。
推荐阅读
- python - 如何有效地计算掷骰子的总和?
- c++ - 如何在 Qt 中打开和最小化外部应用程序到系统托盘
- docker - 如何在 Docker Hub 上找到 Docker 镜像?
- php - 所有从 php 中的 ms 访问数据库中检索数据
- unity3d - 为什么添加到 ui 面板的材料在 android build 中不可见,但在 unity3d 的编辑器窗口中工作正常?
- html - 如何在照片网格中的网格项目上放置链接和文本
- laravel - 更新记录时方法不允许异常
- matlab - 图形可视化表示中节点周围的边界
- javascript - 如何使用 JavaScript 中的函数来转换温度
- system-verilog - 为什么即使使用种子(int 或任何其他)作为变量,$urandom 也会给出相同的值?