【问题标题】:Retrieve data from Firebase but snaptshop.get returns null从 Firebase 检索数据,但 snaptshop.get 返回 null
【发布时间】:2019-05-23 22:25:06
【问题描述】:

我真的是 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=Timestamp(seconds=902876400, nanoseconds=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árcio Marques, id=marMar123}, marco@gmail.com={dataNasc=Timestamp(seconds=923180400,纳秒=0), 邮件=marco@gmail.com, pass=, 名称=Marco António, id=marAnt545}, maria@gmail.com={dataNasc=时间戳(秒=877561200, 纳秒=0), 邮件=maria@ gmail.com, pass=, nome=Maria Antonieta, id=marAnt999}}

daniel@gmail.com

所以,我知道我正在搜索的用户名在数据库中,并且我知道正在从数据库中检索数据,但它一直表现得好像不是。

有人可以帮帮我吗?

编辑

这是我的数据库结构。

这就是我定义 utilizadores 的方式。

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

【问题讨论】:

  • 请仅使用 android-studio 标签来回答有关 Android Studio IDE 本身的问题。对于一般的 Android 编程问题,请使用android 标签。
  • @FrankvanPuffelen 谢谢,下次我会更加小心。
  • 请将您的数据库结构添加为屏幕截图,并向我们展示您的utilizadores 是如何定义的。也请回复@AlexMamo
  • @AlexMamo 我更新了我的问题。如果有什么遗漏,请告诉我。

标签: java android firebase google-cloud-firestore


【解决方案1】:

要根据数据库的结构检查用户是否存在,只需在document.getData() 返回的Map 对象上使用contains() 方法即可。所以在代码中应该是这样的:

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(),方法同上。

【讨论】:

  • 非常感谢@AlexMamo。它现在正在工作。我只是不知道为什么其他方式不起作用,因为我已经以类似的方式从不同的 Firestore 数据库获取数据。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-11
  • 1970-01-01
  • 2018-12-18
相关资源
最近更新 更多