首页 > 解决方案 > 如何将 Cloud Firestore 中的异步数据保存为变量?

问题描述

我开始在 Android 上使用 Firebase SDK 学习Cloud Firestore,我遇到了一个问题,我通过 OnCompleteListener 从 Firestore 数据库中检索数据,然后尝试将其保存为变量。问题是在 OnCompleteListener 结束并且我的 Android 应用程序继续执行下一行代码后,变量中的数据被重置并且没有保存。

我有一个用户集合,并且正在尝试为用户的赛季检索用户的运动:

db.collection("users").document(mAuth.getCurrentUser().getUid()).collection("seasons").document(seasonName)
                .get()
                .addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                        if (task.isSuccessful()) {
                            DocumentSnapshot document = task.getResult();
                            if (document != null && document.exists() && document.getData() != null) {
                                sport = String.valueOf(document.getData().get("sport"));
                                //sport is set to the value
                            }
                        }
                    }
                });
        //Now sport is null

运动设置为侦听器中的值,但在侦听器完成后变为 null。

所以我的问题是,我怎样才能永久保存变量以使其不会返回 null?有没有办法在没有监听器的情况下检索数据,所以我不会遇到这个问题,还是有其他解决方案?

提前致谢!

标签: javaandroidfirebasegoogle-cloud-firestore

解决方案


该变量不会“返回”为空。问题是您添加的侦听器在查询完成后的一段未知时间内被调用。你不知道要花多长时间。因为时间是未知的,所以一个 Task 会被 立即返回get(),并且你附加到它的回调会在一段时间后被调用。由于get()立即返回,因此该变量sport将保留其单独的 null 值,直到调用回调。这意味着您应该只使用回调中的结果。或者,如果您想将它存储在某个地方,只有在您确定回调已被调用时才访问它。

事实上,所有 Firebase API 都是异步的。 阅读本文以了解原因。您应该熟悉异步编程才能使用 Firebase SDK。

特别是对于 Android,您应该了解 Play Services Task API 的工作原理


推荐阅读