我正在尝试制作一个注册页面。在注册该用户之前,我将尝试验证数据库中不存在的用户名和电子邮件。但是,当用户名/电子邮件已经存在时,我不知道该变量是否为false,因此它最终仍然会注册用户。
我怎样才能做到这一点?请指导我。
在注册用户之前检查用户名和电子邮件是否已存在:
if (!checkIfUsernameExists(userName) && !checkIfEmailExists(userEmail)){
registerUser();
}
检查用户名是否存在的方法:
public boolean checkIfUsernameExists(String userName){
boolean isExist = false;
databaseReferenceUser.orderByChild("userName").equalTo(userName).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()){
editTextUserNameRegister.setError("Username already exists");
editTextUserNameRegister.requestFocus();
final boolean isExist = true;
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
return isExist;
}
检查电子邮件是否已存在的方法:
public boolean checkIfEmailExists(String userEmail){
boolean isExist = false;
databaseReferenceUser.orderByChild("userEmail").equalTo(userEmail).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()){
editTextEmailRegister.setError("Email already exists");
editTextEmailRegister.requestFocus();
final boolean isExist = true;
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
return isExist;
}
答案 0 :(得分:3)
您需要自己的回调才能等待Firebase返回数据。一个例子看起来像这样
定义界面
public interface UserCallback {
void onUserExists(Boolean exists);
}
让你的方法无效并添加回调参数,使其成为最终版,以便可以在Firebase方法中引用
public void checkIfEmailExists(String userEmail, final UserCallback callback){
databaseReferenceUser.orderByChild("userEmail").equalTo(userEmail).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()){
editTextEmailRegister.setError("Email already exists");
editTextEmailRegister.requestFocus();
callback.onUserExists(true);
} else {
callback.onUserExists(false);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
// return isExist; // this method is void now
}
现在,您必须在功能上而不是在程序上编写其他代码。
checkIfUsernameExists(userName, new UserCallback() {
@Override
public void onUserExists(Boolean exists) {
if (!exists) {
checkIfEmailExists(userEmail, new UserCallback() {
// registerUser() if not exists
}
}
}
} );
如果您要存储唯一的用户名/电子邮件,则无需同时检查
可在此处找到更完整的界面定义Wait Firebase async retrive data in android
答案 1 :(得分:2)
我发现您使用的是Firebase,使用FirebaseAuth会更好一些,它可以让您以安全,加密和多功能的方式对用户进行身份验证。如果您使用数据库,您可能会冒隐私和用户帐户的安全性(我假设密码未加密,访问规则并非完全私密)。
添加您的Gradle文件:
compile 'com.google.firebase:firebase-auth:11.6.2'
然后您只需启用电子邮件/密码验证:
<强> LoginRegisterActivity.java
1 - 获取实例。
FirebaseAuth mAuth = FirebaseAuth.getInstance();
2 - 获取用户。一旦注册和/或登录,它将被保存。
FirebaseUser user = mAuth.getCurrentUser();
3 - 所以让我们尝试创建一个新用户
mAuth.createUserWithEmailAndPassword(email,password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if(task.isSuccessful()){
//User registered successfully
}else{
// WAIT! SOMETHING WENT WRONG, DESPITE IT IS COMPLETE
}
}
});
4 - 如果任务成功,您可以保留所有内容,finish()
活动,FirebaseAuth
将为您保存,您可以从应用中的任何位置获取信息。
5 - 但任务可能不成功,这是因为项目中已有另一位用户使用相同的电子邮件。因此,在else
onComplete()
内,您可以尝试登录用户。这也很简单。
mAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener(activity, new OnCompleteListener<AuthResult>() {
@Override public void onComplete(@NonNull Task<AuthResult> task) {
//And here you can do whatever you want: create a file on your DB, send a verification email...
});
答案 2 :(得分:0)
已经定义了boolean isExist,不需要再次声明它。
public void checkIfEmailExists(String userEmail){
databaseReferenceUser.orderByChild("userEmail").equalTo(userEmail).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
boolean isExist = dataSnapshot.exists();
if (isExist){
editTextEmailRegister.setError("Email already exists");
editTextEmailRegister.requestFocus();
if(isExist){
//call your required method to do next steps
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}