【发布时间】:2017-12-22 20:44:16
【问题描述】:
我在 Firebase 中有以下数据:
(我还不能在 Stackoverflow 中附加图片):
有一个根节点 -> 根有一个名为“NewStaffRequests”的子节点。 “NewStaffRequests”有多个具有唯一 ID 的用户。在每个唯一 id 下,存在一个特定用户的电子邮件 ID 和角色密钥。 “角色”键可以具有诸如“培训师”之类的值。
电子邮件 ID 已在身份验证系统中注册。未来,会有更多这样的具有唯一 id、email-id 和角色的用户。我想登录,检索其 email-id 是从 Activity 中的 email-id TextView 获得的用户的角色,在“NewStaffRequests”中找到这个 email-id 并获取该用户的角色。我为此编写了以下代码。但是,对象 'StaffUser value' 只会为空。请指教!
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_staff_login);
mAuth = FirebaseAuth.getInstance();
heading = (TextView) findViewById(R.id.heading);
note = (TextView) findViewById(R.id.note);
email = (EditText) findViewById(R.id.enterEmail);
pwd = (EditText) findViewById(R.id.enterPassword);
spinner = (Spinner) findViewById(R.id.roles_spinner);
login = (Button) findViewById(R.id.login);
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
final String staffEmail = email.getText().toString().trim();
final String password = pwd.getText().toString().trim();
if(TextUtils.isEmpty(staffEmail))
{
Toast.makeText(getApplicationContext(), "You must enter your E-Mail!", Toast.LENGTH_SHORT).show();
return;
}
if(TextUtils.isEmpty(password))
{
Toast.makeText(getApplicationContext(), "You must enter your Password!", Toast.LENGTH_SHORT).show();
return;
}
}
mAuth.signInWithEmailAndPassword(staffEmail,password).addOnCompleteListener(StaffLogin.this, new OnCompleteListener<AuthResult>()
{
@Override
public void onComplete(@NonNull Task<AuthResult> task)
{
Log.d(TAG, "successfull login : " + task.isSuccessful());
if (!task.isSuccessful()){
Toast.makeText(StaffLogin.this, "Authentication failed." + task.getException(), Toast.LENGTH_LONG).show();
}
else {
DatabaseReference root = FirebaseDatabase.getInstance().getReference();
Query reference = root.child("NewStaffRequests").orderByChild("email").equalTo(staffEmail);
reference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.getChildrenCount() > 0) {
StaffUser value = dataSnapshot.getValue(StaffUser.class);
String staffRole = value.role;
if(staffRole.equals("Fitness Trainer"))
{
startActivity(new Intent(StaffLogin.this, RMLanding.class));
finish();
}
else
{
Toast.makeText(getApplicationContext(), "The user is someone else", Toast.LENGTH_SHORT).show();
}
}
else{
Toast.makeText(getApplicationContext(), "Something went wrong", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
});
}
});
}
}
而且,以下是 StaffUser 类:
public class StaffUser {
public String email, name, role;
public Boolean approvalStatus;
public StaffUser() {
// Default constructor required for calls to DataSnapshot.getValue(User.class)
}
public StaffUser(String _email, String _name,String _role,Boolean _approvalStatus) {
this.email = _email;
this.name = _name;
this.role = _role;
this.approvalStatus = _approvalStatus;
}
}
以下是错误信息:
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference.
这个错误指向的行是:
String staffRole = value.role;
在亚历克斯的建议下做出的改变:
mAuth.signInWithEmailAndPassword(staffEmail,password).addOnCompleteListener(StaffLogin.this, new OnCompleteListener<AuthResult>()
{
@Override
public void onComplete(@NonNull Task<AuthResult> task)
{
Log.d(TAG, "successfull login : " + task.isSuccessful());
if (!task.isSuccessful()){
Toast.makeText(StaffLogin.this, "Authentication failed." + task.getException(), Toast.LENGTH_LONG).show();
}
else {
DatabaseReference root = FirebaseDatabase.getInstance().getReference();
Query reference = root.child("NewStaffRequests").orderByChild("email").equalTo(staffEmail);
reference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.getChildrenCount() > 0) {
//Toast.makeText(StaffLogin.this, "datasnapshot value" + dataSnapshot.getValue(StaffUser.class), Toast.LENGTH_LONG).show();
StaffUser value = dataSnapshot.getValue(StaffUser.class);//When I attach the debugger on this line, I can see that 'value' is null, but dataSnapshot.getValue(StaffUser.class) is showing the stored database values from firebase.
Log.d(TAG, "datasnapshot value" + value.getRole());
String staffRole = value.getRole();
if(staffRole.equals("Rescue Manager"))
{
startActivity(new Intent(StaffLogin.this, RMLanding.class));
finish();
}
else
{
Toast.makeText(getApplicationContext(), "The user is someone else", Toast.LENGTH_SHORT).show();
}
}
else{
Toast.makeText(getApplicationContext(), "Something went wrong", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
});
【问题讨论】:
标签: android firebase firebase-realtime-database firebase-authentication