Firestore查询 - 检查用户名是否已存在

时间:2018-02-01 19:23:51

标签: java android firebase google-cloud-firestore

我需要有关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() );
                }
            }
        }
    });

3 个答案:

答案 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运行时,在您的条件下上面的哪些日志正在控制台上打印。

  • Log.d(TAG,&#34; onEvent:用户名不存在&#34;);
  • Log.d(TAG,&#34; checkingIfusernameExist:FOUND A MATCH:&#34; + ds.toObject(Users.class).getUsername());
  

另外,你写道你得到没有结果所以假设你期待看到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,并且是您要与之进行比较的用户的用户名。