Cloud Firestore:查询以检查用户名是否存在

时间:2018-04-09 15:34:55

标签: java android firebase google-cloud-firestore

我的Android App中的user - 方法存在问题 基本上,我有一个带有集合username的Cloud Firestore数据库 其文档仅填充passwordemailRegisterActivity(所有字符串)。文档ID是自动生成的。我创建了onCreate(..),效果很好。这是我的RegisterActivity的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(); } } 方法:

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;
    }
}

这是我的UserDatabaseModel.java文件:

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; } - 方法:

validateInputs() == true

这段代码总是找到至少一个带有给定用户名的DocumentSnapshot,我刚输入的那个(当然没有实际保存,因为只有ds.exists()才会调用save-method [这就是事情这让我感到困惑]),如果还有更多已保存,那就更多了。我在这里想念一下(我至少认为<p>Test</p> @foreach ($data as $key => $test) {{ $test }} @endforeach - 调用会确保这些文件已经在数据库中)或者可能是什么问题?

由于

2 个答案:

答案 0 :(得分:1)

我像这样使用它

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);
}

答案 1 :(得分:0)

首先,不需要使用addSnapshotListener。仅当您希望从数据库获取实时更新时才使用此选项,但这不是您的情况。您只想检查existens的用户名,并且只需要get()来电。

mQuery.get().addOnCompleteListener(/* ... */)

其次,根据this postds!=null && ds.exists()不是必需的。您只需要检查ds.exists()

您需要知道的最后一件事是,依赖于userNameExistsAlready()方法返回的值。在大多数情况下,这将是错误的,这是因为您的案例中的onEvent()方法或使用onComplete()来电时onSuccess() / get() asynchronous }。这意味着当您的方法返回结果时,您还没有完成从数据库加载数据。所以快速解决这个问题就是在onEvent()方法中使用你的所有逻辑,或者如果你想在外面使用它,我建议你从这个 post看到我的anwser的最后一部分并且还要看一下 video