如何从OnSuccessListener <QuerySnapshot>()

时间:2019-08-02 15:29:29

标签: java android google-cloud-platform

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 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

onSuccess(QuerySnapshot queryDocumentSnapshots){}中的代码是异步回调see this answer for an explanation,因为对Firebase的调用可能需要一些时间才能完成。 因此,Toast.makeText(MainActivity.this, "From outside : "+checkCode, Toast.LENGTH_LONG).show();行将始终在回调之前执行。

答案 2 :(得分:1)

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

querySnapshot.toObjects(YourObject.class)

因为向firebase的查询是异步的,所以在将值分配给checkCode之前会触发带有Tost FromOutside的行。这是FromOutside为null的原因。

答案 3 :(得分:1)

您正在异步调用Firestore。在OnSuccessListener仍然为空的情况下显示Toast之后,检索数据时将调用onSuccess()的{​​{1}}方法。您可以在checkCode内移动烤面包,也可以只用onSuccess()打印到控制台。