android - 一旦我尝试主要登录这一行,应用程序就会关闭 if (login.getType().equals("Admin") && login.getType() != null)
问题描述
这是 JSON 文本
{
"User" : {
"E10W6iRbAUOa5XbFnedUuepswsw2" : {
"email" : "jay@gmail,com",
"type" : "Admin"
},
"Od6G6kbPHrScLVYrqmovaFP0gw03" : {
"email" : "gloria@yahoo,com",
"type" : "User"
},
"jCiHZCIThdQi1LhVSonN6UNxRok2" : {
"email" : "clara@yahoo,com",
"type" : "User"
}
}
}
如果有if (login.getType().equals("Admin") && login.getType() != null)
任何其他错误,请告诉我
public class SignInActivity extends AppCompatActivity {
private EditText memail;
private EditText mpassword;
private Button mlogin;
private Button mregister;
private ProgressBar mpgbar;
private FirebaseAuth mAuth;
FirebaseDatabase database;
DatabaseReference users;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sign_in);
database = FirebaseDatabase.getInstance();
users = database.getReference("User");
mAuth = FirebaseAuth.getInstance();
memail = findViewById(R.id.emailtv);
mpassword = findViewById(R.id.passwordtv);
mlogin = findViewById(R.id.loginBtn);
mregister = findViewById(R.id.regBtn);
mpgbar = findViewById(R.id.progressBar);
mregister.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(SignInActivity.this, RegisterActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();
return;
}
});
mlogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
LoginUser(memail.getText().toString(), mpassword.getText().toString());
}
});
}
private void inProgress(boolean x) {
if (x) {
mpgbar.setVisibility(View.VISIBLE);
mlogin.setEnabled(false);
mregister.setEnabled(false);
} else {
mpgbar.setVisibility(View.GONE);
mlogin.setEnabled(true);
mregister.setEnabled(true);
}
}
private boolean isEmpty() {
if (TextUtils.isEmpty(memail.getText().toString())) {
memail.setError("REQUIRED");
return true;
}
if (TextUtils.isEmpty(mpassword.getText().toString())) {
mpassword.setError("REQUIRED");
return true;
}
return false;
}
private void LoginUser(final String email, final String pwd) {
if (isEmpty()) return;
inProgress(true);
users.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (!email.isEmpty()) {
User login = dataSnapshot.child(email).getValue(User.class);
if (login.getType().equals("Admin") && login.getType() != null) {
mAuth.signInWithEmailAndPassword(email.replace(",","."), pwd)
.addOnSuccessListener(new OnSuccessListener<AuthResult>() {
@Override
public void onSuccess(AuthResult authResult) {
Toast.makeText(SignInActivity.this, "User signed in", Toast.LENGTH_LONG).show();
Intent intent = new Intent(SignInActivity.this, AdminPage.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();
return;
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(SignInActivity.this, "Sign in failed" + e.getMessage(), Toast.LENGTH_LONG).show();
}
});
} else if (login.getType().equals("User") && login.getType() != null) {
if (isEmpty()) return;
inProgress(true);
mAuth.signInWithEmailAndPassword(email.replace(",","."), pwd)
.addOnSuccessListener(new OnSuccessListener<AuthResult>() {
@Override
public void onSuccess(AuthResult authResult) {
Toast.makeText(SignInActivity.this, "User signed in", Toast.LENGTH_LONG).show();
Intent intent = new Intent(SignInActivity.this, Home.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();
return;
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(SignInActivity.this, "Sign in failed" + e.getMessage(), Toast.LENGTH_LONG).show();
}
});
}
else
{
Toast.makeText(SignInActivity.this, "Sign in failed" , Toast.LENGTH_LONG).show();
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
}
它应该将用户重定向到主页并将管理员重定向到管理页面。但它总是崩溃。
解决方案
您正在加载整个/User
节点,然后尝试从中读取一个User.class
。这行不通,因为/User
包含多个用户。但是您还需要首先查询下面的子项,/User
以仅读取具有您正在寻找的电子邮件地址的用户。
像这样的东西:
private void LoginUser(final String email, final String pwd) {
Query query = users.orderByChild("email").equalTo(email)
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot userSnapshot: dataSnapshot.getChildren()) {
User login = userSnapshot.getValue(User.class);
...
}
}
}
});
}
主要区别:
- 这不是加载所有用户,而是查询
/User
与电子邮件地址匹配的孩子。 - 里面
onDataChange
可能有多个匹配的子节点,所以我们循环这些结果。 - 删除了
child("email")
内部,因为如果您尝试读取整个对象onDataChange
,那将不起作用。User
推荐阅读
- javascript - 如何检测音频是否在javascript中的Web应用程序中播放
- backbone.js - 在大型 Backbone 代码库中查找事物位置的最佳方法是什么?
- c++ - 有人可以向我解释为什么控制台输出 0 吗?
- python - 浮点数的总和 - 'float' 对象不可迭代
- excel - 无法通过 Excel 在 Livelink 上打开 MS Project 文件
- html - 如何在使用引导程序时使容器大小与背景图像相同?
- excel - 从 Outlook 中的电子邮件下载文件
- php - 单击提交时消息字段变为空
- visual-studio-code - 了解 VSCode 键绑定:
对比 - css - CSS - 丢失的网格删除丢失的列,媒体查询