猿问

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

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

这是为什么?我该如何解决?


精慕HU
浏览 126回答 4
4回答

牧羊人nacy

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

鸿蒙传说

要将 QuerySnapshot 转换为您的对象列表,请使用:querySnapshot.toObjects(YourObject.class)在为 checkCode 赋值之前触发带有 Tost FromOutside 的行,因为对 firebase 的查询是异步的。这就是 FromOutside 为空的原因。

繁星点点滴滴

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

慕雪6442864

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

相关分类

Java
我要回答