Android Cloud Firestore:查询以查找用户名
Posted
技术标签:
【中文标题】Android Cloud Firestore:查询以查找用户名【英文标题】:Android Cloud Firestore: Query to find a users name 【发布时间】:2018-11-11 02:54:06 【问题描述】:我在这里寻找了多种解决方案,但找不到任何特定于我的情况的东西,因此我在这里发布一个问题,同时我仍在继续寻找解决方案。我对 Firestore 还是很陌生,他们的指南/文档还不清楚。
我的手机应用程序有一个系统可以让用户输入姓名。此名称将用于遍历 Firestore 数据库,如果该名称作为其中一个用户的字段存在,则该方法必须返回布尔值 true
。
此查询将由我的主要活动中的“继续按钮”触发,如下所示:
//Authenticate user and proceed to next activity
continueBtn = (Button) findViewById(R.id.continue_btn);
continueBtn.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
//On click create a db reference and perform a query on it to find current user
//and authenticate it.
CollectionReference myRef = database.collection("users");
Query findNameQ = myRef.whereEqualTo("name", mUserName);
authenticateUser(findNameQ, mUserName);//I need to pass to this method a variable 'findNameQ' which can be used to validate the existence of a user.
//mUserName is the name it's looking for.
);
一旦查询运行,它就会运行 authenticateUser 方法,该方法基本上验证用户的存在,如果用户不存在则创建一个新的。方法如下:
private void authenticateUser(Query findNameQ, String mUserName)
//Read from database and check if user exists
//if current users name matches to one in database then set userExists to true.
if (findNameQ != null)
userExists = true;
Toast.makeText(this, "User exists!", Toast.LENGTH_SHORT).show();
Toast.makeText(this, "User doesn't exist!", Toast.LENGTH_SHORT).show();
我想使用 if (findNameQ != false) 而不是 null
,如何使我的 findNameQ 变量是布尔值而不是查询对象?
【问题讨论】:
您将不得不实际执行该查询。从 Firestore 读取数据的文档可以在这里找到:firebase.google.com/docs/firestore/query-data/get-data - 你一定要熟悉它是如何工作的。 【参考方案1】:为了知道某个用户名是否存在于 Firestore 数据库中,您需要使用 get()
调用。仅仅创建一个 Query 对象不会为您提供太多。除此之外,如果您检查findNameQ != null
,它将始终评估为true
,因为findNameQ 对象已创建并且永远不会是null
。所以要解决这个问题,请使用以下代码行:
productsRef.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>()
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task)
if (task.isSuccessful())
for (QueryDocumentSnapshot document : task.getResult())
if (document.exists())
authenticateUser(findNameQ, mUserName);
);
还请注意,使用addSnapshotListener
对您没有帮助,因为它会附加一个侦听器以实时获取数据,但这不是您所需要的。您只需获取一次数据。
【讨论】:
啊,我明白了,所以无论查询结果如何,都会创建查询对象。非常感谢。我无法理解查询对象的属性。 是的,你是对的。不管查询的结果是什么,都会创建查询对象。不客气,干杯!【参考方案2】:您可以使用布尔变量作为 boolean nameFound = false;
现在,将快照侦听器附加到您的查询以检查名称是否存在:
findNameQ.addSnapshotListener(new EventListener<QuerySnapshot>()
@Override
public void onEvent(QuerySnapshot queryDocumentSnapshots, FirebaseFirestoreException e)
for (DocumentSnapshot ds: queryDocumentSnapshots)
if (ds!=null && ds.exists())
Toast.makeText(RegisterActivity.this, "Username Exists!", Toast.LENGTH_SHORT).show();
nameFound = true;
);
否则将使用 nameFound 的默认值 false。现在,使用 if else 可以根据 nameFound 的值调用你的认证方法。
【讨论】:
如果这对你有用@Adrian Robertson,请勾选我的答案下方左侧的勾号图标,将答案标记为已接受。以上是关于Android Cloud Firestore:查询以查找用户名的主要内容,如果未能解决你的问题,请参考以下文章
无法在 Android 上使用 Cloud Firestore 保存文档
如何将 Cloud Firestore 中的数据分配给 Android 的全局变量 [重复]
Android java:如何创建 POJO 并将其转换为 Cloud Firestore REST API 可接受的 JSON