0

나는 중포 기지에 다음과 같은 데이터를 가지고 : 이메일이 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) { 

           } 
          }); 


         } 



        } 
       }); 

답변

0

, java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference, 그것은 staffRole 문자열 null 있음을 의미합니다.

public String getRole() { 
    return role; 
} 

참고 :

String staffRole = value.getRole(); 

이것은 또한이 같은 모델 클래스 내에서이 방법을 추가 할 필요가 있음을 의미합니다 :

는이 문제를 해결하려면 다음 코드 줄을 사용할 필요가 , 모든 필드에 public getter를 추가해야하며 클래스 자체에서 볼 때 공개 필드가 아닌 private 필드 여야합니다. 귀하의 클래스는 다음과 같아야합니다

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference(); 
Query query = rootRef.child("NewStaffRequests").orderByChild("email").equalTo(staffEmail); 
ValueEventListener eventListener = new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     for(DataSnapshot ds : dataSnapshot.getChildren()) { 
      StaffUser value = dataSnapshot.getValue(StaffUser.class); 
      Log.d("TAG", value.getRole()); 
     } 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) {} 
}; 
query.addListenerForSingleValueEvent(eventListener); 
+0

가, 알렉스 감사 :

public class StaffUser { private String email, name, role; private boolean approvalStatus; public StaffUser() {} public StaffUser(String email, String name, String role, Boolean approvalStatus) { this.email = email; this.name = name; this.role = role; this.approvalStatus = approvalStatus; } public String getEmail() {return email;} public String getName() {return name;} public String getRole() {return role;} public boolean getApprovalStatus() {return approvalStatus;} } 

실제 개체를 얻으려면, follwing을 코드를 사용하십시오! 필자가 언급 한 것처럼 StaffUser 클래스를 변경했습니다 (필자는 getter 및 setter 메서드를 추가했습니다). 하지만 여전히 같은 오류가 발생합니다. 다음은 디버깅 할 때의 문제입니다. StaffUser value = dataSnapshot.getValue (StaffUser.class); 디버거를 연결하면 해당 dataSnapshot.getValue (StaffUser.class); 실제로 데이터베이스에서 값을 가져 오는 중입니다. 그러나 동시에 StaffUser 유형의 값은 null입니다. 왜 '값'에 어떤 값도 할당되지 않은 이유를 모르겠습니다. – notem101

+0

여기서, 의미는? 이 코드 줄'String staffRole = value.role; '을'String staffRole = value.getRole();'으로 변경 했습니까? –

+0

죄송합니다, 주요 질문을 참조하십시오. 편집 된 코드로 새 섹션을 추가했습니다. 제가 언급 한 긴 코멘트를보십시오. – notem101