我开始学习Cloud Firestore在 Android 上使用 Firebase SDK 时,我遇到了一个问题:我通过 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?有没有一种方法可以在没有监听器的情况下检索数据,这样我就不会遇到这个问题,或者还有其他解决方案吗?
提前致谢!
最佳答案
该变量不会“返回”为 null。问题是您添加的监听器在查询完成后一段未知的时间内被调用。你不知道要花多长时间。由于时间未知,get()
会立即返回任务,并且您附加到它的回调将在一段时间后被调用。由于 get()
立即返回,因此变量 sport
将保留其单独的 null 值,直到调用回调为止。这意味着您应该只使用回调中的结果。或者,如果您想将其存储在某个地方,只有在确定回调已被调用时才访问它。
事实上,所有 Firebase API 都是异步的。 Read this了解原因。您应该熟悉异步编程才能使用 Firebase SDK。
特别对于 Android,you should learn how the Play Services Task API works .
关于java - 如何将 Cloud Firestore 中的异步数据保存为变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55943118/