如何将Cloud Firestore中的异步数据另存为变量?

时间:2019-05-01 21:48:49

标签: java android firebase google-cloud-firestore

我开始在Android上使用Firebase SDK学习Cloud Firestore,并且遇到了一个问题,即我通过OnCompleteListener从Firestore数据库检索数据,然后尝试将其另存为变量。问题在于,在OnCompleteListener结束并且我的Android App移至下一行代码后,该变量中的数据将被重置而不保存。

我有一个用户集合,正在尝试检索其季节内的一项运动:

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。

所以我的问题是,如何才能永久保存变量,以使它不会返回空值?有没有一种方法可以在没有侦听器的情况下检索数据,这样我就不会遇到这个问题,还是有其他解决方案?

谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

专门针对Android,you should learn how the Play Services Task API works