我的Android App中的user
- 方法存在问题
基本上,我有一个带有集合username
的Cloud Firestore数据库
其文档仅填充password
,email
和RegisterActivity
(所有字符串)。文档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
- 调用会确保这些文件已经在数据库中)或者可能是什么问题?
由于
答案 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 post,ds!=null && ds.exists()
不是必需的。您只需要检查ds.exists()
。
您需要知道的最后一件事是,不依赖于userNameExistsAlready()
方法返回的值。在大多数情况下,这将是错误的,这是因为您的案例中的onEvent()
方法或使用onComplete()
来电时onSuccess()
/ get()
asynchronous
}。这意味着当您的方法返回结果时,您还没有完成从数据库加载数据。所以快速解决这个问题就是在onEvent()
方法中使用你的所有逻辑,或者如果你想在外面使用它,我建议你从这个 post看到我的anwser的最后一部分并且还要看一下 video 。