首页 > 解决方案 > 使用 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产生错误。在这样的方法中是否有访问元素的标准方法?

声明一个变量并尝试在类中改变也是不可能的,除非变量是最终的,这违背了这一点。

标签: javaandroidfirebasegoogle-cloud-firestore

解决方案


我想让我的程序将 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()方法内部使用该对象列表,正如我在上面已经写过的那样,或者如果您想在外部使用它,我建议您从这篇文章中查看我的答案的最后一部分,我在其中已经解释了如何使用自定义回调来完成。您也可以观看此视频以更好地理解。


推荐阅读