나는 중포 기지에 다음과 같은 데이터를 가지고 : 이메일이 Firebase에 알려진 사용자에 관한 정보를 얻는 방법?
(나는 이미지를 첨부 할 수 아직 유래에 있지 않다) : 루트 노드가있다은 -> 루트 "NewStaffRequests"라는 자식 노드를 가지고있다. "NewStaffRequests"에는 고유 한 ID를 가진 여러 사용자가 있습니다. 각 고유 ID 아래에는 특정 사용자의 전자 메일 ID와 역할 키가 있습니다. '역할'키는 '강사'와 같은 값을 가질 수 있습니다.
email-id는 이미 인증 시스템에 등록되어 있습니다. 앞으로 고유 ID, 전자 메일 ID 및 역할을 가진 많은 사용자가 생길 것입니다. 나는 로그인하고, Activity의 email-id TextView에서 email-id를 얻은 사용자의 역할을 검색하고, "NewStaffRequests"에서이 email-id를 찾아 해당 사용자의 역할을 얻고 싶다. 나는 이것을 위해 다음과 같은 코드를 작성했다. 그러나 'StaffUser value'객체는 null 만 가져옵니다. 제발 조언 해!
@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) {
}
});
}
}
});
가, 알렉스 감사 :
실제 개체를 얻으려면, follwing을 코드를 사용하십시오! 필자가 언급 한 것처럼 StaffUser 클래스를 변경했습니다 (필자는 getter 및 setter 메서드를 추가했습니다). 하지만 여전히 같은 오류가 발생합니다. 다음은 디버깅 할 때의 문제입니다. StaffUser value = dataSnapshot.getValue (StaffUser.class); 디버거를 연결하면 해당 dataSnapshot.getValue (StaffUser.class); 실제로 데이터베이스에서 값을 가져 오는 중입니다. 그러나 동시에 StaffUser 유형의 값은 null입니다. 왜 '값'에 어떤 값도 할당되지 않은 이유를 모르겠습니다. – notem101
여기서, 의미는? 이 코드 줄'String staffRole = value.role; '을'String staffRole = value.getRole();'으로 변경 했습니까? –
죄송합니다, 주요 질문을 참조하십시오. 편집 된 코드로 새 섹션을 추가했습니다. 제가 언급 한 긴 코멘트를보십시오. – notem101