为了账号安全,请及时绑定邮箱和手机立即绑定

如何从 OnSuccessListener<QuerySnapshot>() 获取数据

如何从 OnSuccessListener<QuerySnapshot>() 获取数据

精慕HU 2023-05-10 16:26:37
public class MainActivity extends AppCompatActivity {    private static final String TAG = "100";    FirebaseFirestore db;    String checkCode;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        db= FirebaseFirestore.getInstance();        db.collection("Users")                .whereEqualTo("level", "admin")                .get()                .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {                    @Override                    public void onSuccess(QuerySnapshot queryDocumentSnapshots) {                        if (!queryDocumentSnapshots.isEmpty()) {                            List<DocumentSnapshot> list = queryDocumentSnapshots.getDocuments();                            for (DocumentSnapshot d : list) {                                checkCode = (String) d.get("kode");                                Toast.makeText(MainActivity.this, "From inside : "+checkCode, Toast.LENGTH_LONG).show();                                }                            }                        }                    });        Toast.makeText(MainActivity.this, "From outside : "+checkCode, Toast.LENGTH_LONG).show();    }}我仍然对如何从 Cloud Firestore 获取数据感到困惑。所以我尝试制作一个简单的代码来从那里获取数据。我输入了 1111 代码。运行程序后,里面的吐司给我:From inside : 1111 但是外面的吐司给我:From outside : null这是为什么?我该如何解决?
查看完整描述

4 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

您正在对 Firestore 进行异步调用。检索数据时调用的方法,在您显示 Toast 之后 whileOnSuccessListener仍然为 null。您可以将 toast 移入内部或仅用于打印到控制台。onSuccess()checkCodeonSuccess()Log



查看完整回答
反对 回复 2023-05-10
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

要将 QuerySnapshot 转换为您的对象列表,请使用:

querySnapshot.toObjects(YourObject.class)

在为 checkCode 赋值之前触发带有 Tost FromOutside 的行,因为对 firebase 的查询是异步的。这就是 FromOutside 为空的原因。


查看完整回答
反对 回复 2023-05-10
?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

答案很简单,您checkCode全局声明了变量,但它没有任何值。所以它将是null有价值的,并且这个价值在那里被烘烤。但是在OnSuccessListener执行时它的值将由代码分配checkCode = (String) d.get("kode");,所以你得到 1111 作为它的值。



查看完整回答
反对 回复 2023-05-10
?
慕雪6442864

TA贡献1812条经验 获得超5个赞

里面的代码onSuccess(QuerySnapshot queryDocumentSnapshots){}是一个异步回调看到这个答案的解释,因为对 Firebase 的调用可能需要一些时间才能完成。因此,该行将Toast.makeText(MainActivity.this, "From outside : "+checkCode, Toast.LENGTH_LONG).show();始终在回调执行之前执行。



查看完整回答
反对 回复 2023-05-10
  • 4 回答
  • 0 关注
  • 100 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信