我需要有关Firestore查询的帮助。我有一个all_users
数据集合,用户ID文档和每个用户信息。 firestore database image我想检查用户名是否已存在。我得到了如何获取()文档和比较,如他们的网页上所示,但数据查询怎么样?,这是我的代码
更新小部件 - (如果mUser文本字段和当前用户名不相同)
private void saveProfileSettings(){
final String username = mUsername.getText().toString();
//Case 1: user did not change their username
if (!mUsers.getUsername().equals(username)){
checkingIfusernameExist(username);
}else {
}
}
checkingIfusernameExist方法
private void checkingIfusernameExist(final String username){
Log.d(TAG, "checkingIfusernameExist: Checking if " + username + " Exists");
Query mQuery = mFirebaseFirestore.collection("all_users")
.orderBy(getString(R.string.fields_username))
.whereEqualTo("username", username);
mQuery.addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(QuerySnapshot documentSnapshots, FirebaseFirestoreException e) {
if (documentSnapshots != null){
Log.d(TAG, "onEvent: username does not exists");
Toast.makeText(getActivity(), "Username is available", Toast.LENGTH_SHORT).show();
}
for (DocumentSnapshot ds: documentSnapshots){
if (ds.exists()){
Log.d(TAG, "checkingIfusernameExist: FOUND A MATCH: " + ds.toObject(Users.class).getUsername());
Toast.makeText(getActivity(), "That username already exists.", Toast.LENGTH_SHORT).show();
}
}
}
});
}
我没有得到任何错误也没有结果。我到处搜寻,我没有看到像我这样的问题。此外,我可以使用的问题并不多。任何更正都将受到赞赏,提前谢谢。
更新:经过几天的搜索,我实际上得到了一个解决方案,借助我得到的答案。所以,因为firestore没有操作逻辑,并且你想要更新如果.whereEqualTo不存在用户名,请使用任务查找包含任何有效负载。
适用于我的代码
checkingIfUsernameExists方法
private void checkingIfusernameExist(final String usernameToCompare){
//----------------------------------------------------------------
final Query mQuery = mFirebaseFirestore.collection("all_users").whereEqualTo("username", usernameToCompare);
mQuery.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
Log.d(TAG, "checkingIfusernameExist: checking if username exists");
if (task.isSuccessful()){
for (DocumentSnapshot ds: task.getResult()){
String userNames = ds.getString("username");
if (userNames.equals(usernameToCompare)) {
Log.d(TAG, "checkingIfusernameExist: FOUND A MATCH -username already exists");
Toast.makeText(getActivity(), "username already exists", Toast.LENGTH_SHORT).show();
}
}
}
//checking if task contains any payload. if no, then update
if (task.getResult().size() == 0){
try{
Log.d(TAG, "onComplete: MATCH NOT FOUND - username is available");
Toast.makeText(getActivity(), "username changed", Toast.LENGTH_SHORT).show();
//Updating new username............
}catch (NullPointerException e){
Log.e(TAG, "NullPointerException: " + e.getMessage() );
}
}
}
});
答案 0 :(得分:1)
以下查询返回提供usernameToCheck的所有用户。如果用户名是唯一的,那么你只能获得一个documentSnapShot。
Query mQuery = mFirebaseFirestore.collection("all_users")
.whereEqualTo("username", "usernameToCheck");
mQuery.addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(QuerySnapshot documentSnapshots, FirebaseFirestoreException e) {
for (DocumentSnapshot ds: documentSnapshots){
if (ds!=null){
String userName = document.getString("username");
Log.d(TAG, "checkingIfusernameExist: FOUND A MATCH: " +userName );
Toast.makeText(getActivity(), "That username already exists.", Toast.LENGTH_SHORT).show();
}
}
}
});
答案 1 :(得分:0)
由于我无法发表评论,我将其作为答案输入:
我想知道在运行snapshotListener时, 日志 的外观如何。
在spanshotListener运行时,在您的条件下上面的哪些日志正在控制台上打印。
另外,你写道你得到没有结果所以假设你期待看到Toasts但是不能安全吗?
此外,在浏览代码后,我根据this documentation添加了 评论 :
n=numeric(0)
list_mat <- list()
for (i in 1:3){
n[i]=5^i
m=numeric(0)
m=matrix(data=0,nrow=n[i],ncol=n[i])
for (j in n[i]:1){
for (k in 1:i){
m[j,k]=j+k
}
}
list_mat[[i]] <- m #Holding Matrix
}
我无法对您提供的数据进行进一步调试。但this link可能对您有所帮助。
答案 2 :(得分:0)
要解决此问题,请使用以下代码:
FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference allUsersRef = rootRef.collection("all_users");
allUsersRef.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (DocumentSnapshot document : task.getResult()) {
String userName = document.getString("username");
if (userName.equals(userNameToCompare)) {
Toast.makeText(getActivity(), "That username already exists.", Toast.LENGTH_SHORT).show();
} else {
Log.d(TAG, "onEvent: username does not exists");
}
}
} else {
Log.d("TAG", "Error getting documents: ", task.getException());
}
}
});
其中userNameToCompare
的类型为String,并且是您要与之进行比较的用户的用户名。