java - 云Firestore : Query to check if a username exists

标签 java android firebase google-cloud-firestore

我的 Android 应用程序中的 userNameExistsAlready 方法存在问题。
基本上,我有一个包含 user 集合的 Cloud Firestore 数据库。
其文档仅填充用户名密码电子邮件(均为字符串)。文档 ID 是自动生成的。我创建了一个运行良好的 RegisterActivity 。这是我的 RegisterActivity 的 onCreate(..) 方法:

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);

userNameInput = (TextInputEditText) findViewById(R.id.userNameInput);
emailInput = (TextInputEditText) findViewById(R.id.emailInput);
passwordInput = (TextInputEditText) findViewById(R.id.passwordInput);
Button registerButton = findViewById(R.id.createAccountButton);

registerButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        userNameText = userNameInput.getText().toString();
        emailText = emailInput.getText().toString();
        passwordText = passwordInput.getText().toString();
        if (validateInputs()) {
            saveUser();
        } else {
            Toast.makeText(RegisterActivity.this, "Inputs invalid! Please correct.", Toast.LENGTH_SHORT).show();
        }
    }

    private void saveUser() {
        if (new UserDatabaseModel(userNameText, passwordText, emailText).saveUser()) {
            Toast.makeText(RegisterActivity.this, "User Created!", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(RegisterActivity.this, "User Creation Failed!", Toast.LENGTH_SHORT).show();
        }
    }

这是我的 UserDatabaseModel.java 文件:

public class UserDatabaseModel {
    public final static String DATABASE_DECLARATION = "user";
    private final FirebaseFirestore db = FirebaseFirestore.getInstance();
    private String username;
    private String password;
    private String email;

    public UserDatabaseModel(String username, String password, String email) {
        this.username = username;
        this.password = password;
        this.email = email;
    }
    public UserDatabaseModel() {

    }

    public boolean saveUser() {

        try {
            db.collection(UserDatabaseModel.DATABASE_DECLARATION).document().set(this);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    public String getUsername() {
        return username;
    }
    public String getPassword() {
        return password;
    }
    public String getEmail() {
        return email;
    }
}

我的 validateInputs() 方法执行一些基本操作,例如检查输入的长度,以及调用 if (userNameExistsAlready()) { return false}.
现在是重要的部分,userNameExistsAlready()-方法:

    private boolean userNameExistsAlready() {
        Query mQuery = db.collection(UserDatabaseModel.DATABASE_DECLARATION)
                .whereEqualTo("username", userNameText);

        mQuery.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 Already!", Toast.LENGTH_SHORT).show();
                    }
                }
            }
        });
        return false;
}

这段代码总是找到至少一个具有给定用户名的 DocumentSnapshot,即我刚刚输入的那个(当然没有实际保存它,因为只有在 validateInputs() == true< 时才会调用保存方法[这是让我困惑的事情]),如果已经保存了更多,则还有更多。我是否错过了这里的某些内容(我认为至少 ds.exists() 调用将确保这些文件已经在数据库中)或者可能是什么问题?

谢谢

最佳答案

我是这样使用的

public void checkFieldIsExist(String key, String value, OnSuccessListener<Boolean> onSuccessListener) {
    db.collection("users").whereEqualTo(key, value).addSnapshotListener(new EventListener<QuerySnapshot>() {
        private boolean isRunOneTime = false;

        @Override
        public void onEvent(QuerySnapshot queryDocumentSnapshots, FirebaseFirestoreException e) {
            if (!isRunOneTime) {
                isRunOneTime = true;
                List<DocumentSnapshot> snapshotList = queryDocumentSnapshots.getDocuments();
                if (e != null) {
                    e.printStackTrace();
                    String message = e.getMessage();
                    onSuccessListener.onSuccess(false);
                    return;
                }

                if (snapshotList.size() > 0) {
                    //Field is Exist
                    onSuccessListener.onSuccess(false);
                } else {
                    onSuccessListener.onSuccess(true);
                }

            }
        }
    });
}

使用

 checkFieldIsExist("username", "dummy", new OnSuccessListener<Boolean>() {
                            @Override
                            public void onSuccess(Boolean aBoolean) {
                                if(aBoolean){
                                    //
                                }else{
                                    //username is exist
                                }
                            }
                        });

您可以使用它代替 OnSuccesListener

public interface OnCompleteListener<T> {
    void onComplete(T result);
}

关于java - 云Firestore : Query to check if a username exists,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49736656/

相关文章:

java - JFreeChart 顶部的叠加按钮

java - 无法比较警报对话框编辑文本和我的字符串中的值

android - android studio 在哪里构建我的 .apk 文件?

web - polymer 1.2 防火警告 : Exception was thrown by user callback

Firebase云函数: Accessing Data from a different node

java - Firebase 数据库 : Out of Memory Exception on querying huge amount of data on Android app

java - 如何在 Spring Boot 项目 : 上正确配置 Intellij IDEA 中的 jRebel

java - spring中如何定义Map值的序列

java - libGDX - 尝试实现 2 个 Sprite 之间的碰撞

java - 在没有上下文的情况下访问资源