私は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) {
}
});
}
}
});
は、アレックスをありがとう:
実際のオブジェクトを取得するには、follwingコードを使用してください!あなたが言及したように私はStaffUserクラスを変更しました(私はゲッターメソッドとセッターメソッドを追加しました)。しかし、私は同じエラーが表示されます。ここで、デバッグしようとしたときの問題がどこにありますか。 StaffUser value = dataSnapshot.getValue(StaffUser.class); 私はデバッガを接続すると、私はそのdataSnapshot.getValue(StaffUser.class)を見ることができます。実際にデータベースから値を取得しています。しかし同時に、StaffUser型の値はnullです。なぜ '値'に値が割り当てられていないのかわかりません。 – notem101
ここで、このコード行を 'String staffRole = value.role;' String staffRole = value.getRole(); 'に変更しましたか? –
申し訳ありませんが、主な質問をご覧ください。編集したコードで新しいセクションを追加しました。私が言及した長いコメントをご覧ください。 – notem101