【问题标题】:Firestore query - checking if username already existsFirestore 查询 - 检查用户名是否已存在
【发布时间】:2018-07-12 05:19:45
【问题描述】:

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

【问题讨论】:

    标签: java android firebase google-cloud-firestore


    【解决方案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();
                        }
                    }
                }
            });
    

    【讨论】:

    • 找不到重复用户名的情况如何处理?
    • 您是否在您的应用中提供类似 Google auth 的登录身份验证?
    • 有身份验证,但使用电子邮件和密码。此方法仅检查用户名是否存在。它不包括“其他”声明。或者你有使用你的代码的方法吗?
    • if (ds!=null) 表示存在用户名,您可以使用else 块告诉ds is null,这意味着不存在像userNameToCheck 这样的用户名。上述方法直接有效,因为它只查询所有文档中的userNameToCheck。如果匹配用户名,它将返回 ds set 否则 ds 将为空,这意味着不存在这样的用户名。就这么简单!!
    【解决方案2】:

    要解决这个问题,请使用以下代码行:

    FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
    CollectionReference allUsersRef = rootRef.collection("all_users");
    Query userNameQuery = allUsersRef.whereEqualTo("username", "userNameToCompare");
    userNameQuery.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            if (task.isSuccessful()) {
                for (DocumentSnapshot document : task.getResult()) {
                    if (document.exists()) {
                        String userName = document.getString("username");
                        Log.d(TAG, "username already exists");
                    } else {
                        Log.d(TAG, "username does not exists");
                    }
                }
            } else {
                Log.d("TAG", "Error getting documents: ", task.getException());
            }
        }
    });
    

    其中userNameToCompare 是字符串类型,是您要与之进行比较的用户的用户名。

    【讨论】:

    • “userNameToCompare”会是什么样子?我理解你的代码。如果显示现有用户名,这只是遍历所有用户名的逻辑。似乎比较文档很容易而不是文档中的数据。你能帮忙解决吗?顺便说一句,我从上一个问题中记住了您的用户名。我用你的解决方案解决了。
    • userNameToCompare 会是什么样子?这是一个字符串。是用户键入的名称,您要验证是否存在。这是userNameToCompare = mUsername.getText().trim().toString();。我不明白。这不是你想要的吗?检查用户名是否存在?
    • 读取所有用户文档以找到具有特定名称的文档非常浪费,无论是带宽还是收费读取 ($)。更好的方法是使用查询,例如 Mohammed 在他的answer 中展示的内容。
    • @FrankvanPuffelen 哦,一个旧答案。事实上,查询更有可能被使用。再次感谢粉扑!
    【解决方案3】:

    由于我无法发表评论,因此我将其作为答案输入:

    我想知道您的日志在 snapshotListener 运行时的样子。

    如,当 spanshotListener 运行时,在您的条件下,上面哪些日志正在控制台上打印。

    • Lo​​g.d(TAG, "onEvent: 用户名不存在");
    • Lo​​g.d(TAG, "checkingIfusernameExist: FOUND A MATCH:" + ds.toObject(Users.class).getUsername());

    另外,您写的是没有结果,因此可以假设您希望看到 Toasts 但无法看到吗?

    另外,在浏览了你的代码之后,我已经把 cmets 基于this documentation:

    mQuery.addSnapshotListener(new EventListener<QuerySnapshot>() {
        @Override
        public void onEvent(QuerySnapshot documentSnapshots, FirebaseFirestoreException e) {
    
            if (documentSnapshots != null){ 
            // you are checking here whether your querySnapshot is not null
            // instead of checking whether it is null or empty.
            // taking a wild guess here but could try to modify 
            // your if condition as follows -->
            // if (documentSnapshots.isEmpty()) {
                Log.d(TAG, "onEvent: username does not exists");
                Toast.makeText(getActivity(), "Username is available", Toast.LENGTH_SHORT).show();
            }
            // below as well documentSnapshots is assumed to be not null, 
            // hence all the more reason I am taking the above wild guess
            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();
                }
            }
        }
    });
    

    我无法进一步调试您提供的数据。但是this link 可能对您有更多帮助。

    【讨论】:

    • 由于某种原因,(document.isEmpty()) 似乎无法用于 firestore,因为它在实时数据库中。那会更有意义。我认为它会做同样的事情。一般来说,我仍在阅读文档,可能需要经历更粗糙的部分。您提供的链接可能会有所帮助。
    • 是的,对于 FireStore,您需要检查 QuerySnapshot 变量,即 documentSnapshots.isEmpty() 而不是在实时数据库中工作的 document.isEmpty()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-31
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-28
    相关资源
    最近更新 更多