我真的是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
因此,我知道我要搜索的用户名在数据库中,并且我知道正在从数据库中检索数据,但它一直在起作用,而不是从数据库中检索。
请问有人可以帮我吗?
修改
这是我的数据库结构。
这就是我定义utilizadores的方式。
DocumentReference utilizadores = db.collection("Domum").document("Utilizador");
答案 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()
。