从Firebase检索数据,但snaptshop.get返回null

时间:2019-05-23 22:25:06

标签: java android firebase google-cloud-firestore

我真的是Firebase的新手。 我正在制作一个使用Firestore作为数据库的Android应用程序。我的问题是当我尝试检查某些数据是否存在时。它总是会说不。

这是发生这种情况的方法。

private void usernameInDatabase(final String username){

        if (registration != null)
            registration.remove();

        registration = utilizadores.addSnapshotListener(new EventListener<DocumentSnapshot>() {
            @Override public void onEvent(@Nullable DocumentSnapshot snapshot,
                                          @Nullable FirebaseFirestoreException e) {
                if (e != null) {
                    Log.w("Utilizadores", "Listen failed.", e);
                    return;
                }
                if (snapshot != null && snapshot.exists()) {
                    Log.d("Utilizadores", snapshot.getData().toString());
                    Log.d("Utilizadores", username);
                    if (snapshot.get(username) == null) {
                        loginFormState.setValue(new LoginFormState(R.string.utilizadorNaoBaseDados, null));
                        utilizadorNaBaseDados = false;
                        Log.d("Utilizadores", "Not Database :(");
                    } else {
                        utilizadorNaBaseDados = true;
                        Log.d("Utilizadores", "base de dados ;D");
                    }
                } else {
                    Log.d("Utilizadores", "Current data: null");
                }
            }
        });
    }

如您所见,我在此处检查可从Firestore检索的数据:

                    Log.d("Utilizadores", snapshot.getData().toString());
                    Log.d("Utilizadores", username);

这是我在logcat中得到的:

  

{daniel@gmail.com= {dataNasc = Timestamp(seconds = 862182000,nanoseconds = 0),mail=daniel@gmail.com,pass =,nome = Daniel Marco,id = danMar125},ester@gmail.com = {dataNasc =时间戳(seconds = 902876400,纳秒= 0),mail=ester@gmail.com,pass =,nome = Ester Mendes,id = est124},ola@g.co=hgjk,marcio@gmail.com= {dataNasc = Timestamp(seconds = 680914800,nanoseconds = 0),mail=marcio@gmail.com,pass =,nome =MárcioMarques,id = marMar123},marco@gmail.com= {dataNasc = Timestamp(seconds = 923180400,毫秒= 0),邮件=marco@gmail.com,传递=,nome =马可·安东尼奥,id = marAnt545},玛丽亚@ gmail.com = {dataNasc = Timestamp(seconds = 877561200,纳秒= 0),邮件= maria @ gmail.com,pass =,nome = Maria Antonieta,id = marAnt999}}

     

daniel@gmail.com

因此,我知道我要搜索的用户名在数据库中,并且我知道正在从数据库中检索数据,但它一直在起作用,而不是从数据库中检索。

请问有人可以帮我吗?

修改

这是我的数据库结构。

enter image description here

这就是我定义utilizadores的方式。

  DocumentReference utilizadores = db.collection("Domum").document("Utilizador");

1 个答案:

答案 0 :(得分:1)

要根据数据库的结构检查用户的存在,只需在contains()返回的Map对象上使用document.getData()方法。因此,在代码中应如下所示:

utilizadores.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
        if (task.isSuccessful()) {
            DocumentSnapshot document = task.getResult();
            if (document.exists()) {
                Map<String, Object> map = document.getData();
                if (map.containsKey("daniel@gmail.com")) {
                    Log.d(TAG, "User exists!");
                } else {
                    Log.d(TAG, "User does not exist!");
                }
            } else {
                Log.d(TAG, "No such document");
            }
        }
    }
});

如果您需要实时获取数据,则应该以与上述相同的方式使用addSnapshotListener()

相关问题