0

私はFirebaseに次のデータを持っている:電子メールがFirebaseで知られているユーザーに関する情報を取得する方法は?

(私は画像を付着させ、まだStackOverflowのではないのです):

ルートノードがあります - >ルートは「NewStaffRequests」と呼ばれる子ノードを持っています。 "NewStaffRequests"には一意のIDを持つ複数のユーザーがいます。一意のIDごとに、特定のユーザーの電子メールIDと役割キーが1つ存在します。 「役割」キーには「トレーナー」などの値を含めることができます。

電子メールIDは、認証システムで既に登録されています。将来的には、一意のID、電子メールID、役割を持つこのようなユーザーがさらに多くなります。私はログインし、その電子メールIDがアクティビティのemail-id TextViewから取得されたユーザのロールを取得し、この電子メールIDを "NewStaffRequests"で見つけて、そのユーザの役割を取得したい。私はこれのために次のコードを書いています。ただし、オブジェクト「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は、それが文字列nullであることを意味します。

public String getRole() { 
    return role; 
} 

注:

String staffRole = value.getRole(); 

これはまた、あなたがこのようなあなたのモデルクラス内でこのメソッドを追加する必要があることを意味:

は、この問題を解決するには、次のコード行を使用する必要がありますあなたはすべてのフィールドにpublic getterを追加する必要があり、フィールド自体は私のクラスで見られるように非公開でpublicでなければなりません。あなたのクラスには、次のようになります。

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クラスを変更しました(私はゲッターメソッドとセッターメソッドを追加しました)。しかし、私は同じエラーが表示されます。ここで、デバッグしようとしたときの問題がどこにありますか。 StaffUser value = dataSnapshot.getValue(StaffUser.class); 私はデバッガを接続すると、私はそのdataSnapshot.getValue(StaffUser.class)を見ることができます。実際にデータベースから値を取得しています。しかし同時に、StaffUser型の値はnullです。なぜ '値'に値が割り当てられていないのかわかりません。 – notem101

+0

ここで、このコード行を 'String staffRole = value.role;' String staffRole = value.getRole(); 'に変更しましたか? –

+0

申し訳ありませんが、主な質問をご覧ください。編集したコードで新しいセクションを追加しました。私が言及した長いコメントをご覧ください。 – notem101

関連する問題