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