首页 > 解决方案 > 一旦我尝试主要登录这一行,应用程序就会关闭 if (login.getType().equals("Admin") && login.getType() != null)

问题描述

这是 JSON 文本

{
  "User" : {
    "E10W6iRbAUOa5XbFnedUuepswsw2" : {
      "email" : "jay@gmail,com",
      "type" : "Admin"
    },
    "Od6G6kbPHrScLVYrqmovaFP0gw03" : {
      "email" : "gloria@yahoo,com",
      "type" : "User"
    },
    "jCiHZCIThdQi1LhVSonN6UNxRok2" : {
      "email" : "clara@yahoo,com",
      "type" : "User"
    }
  }
}

如果有if (login.getType().equals("Admin") && login.getType() != null) 任何其他错误,请告诉我

public class SignInActivity extends AppCompatActivity {

    private EditText memail;
    private EditText mpassword;
    private Button mlogin;
    private Button mregister;
    private ProgressBar mpgbar;
    private FirebaseAuth mAuth;
    FirebaseDatabase database;
    DatabaseReference users;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sign_in);
        database = FirebaseDatabase.getInstance();
        users = database.getReference("User");
        mAuth = FirebaseAuth.getInstance();
        memail = findViewById(R.id.emailtv);
        mpassword = findViewById(R.id.passwordtv);
        mlogin = findViewById(R.id.loginBtn);
        mregister = findViewById(R.id.regBtn);
        mpgbar = findViewById(R.id.progressBar);

        mregister.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(SignInActivity.this, RegisterActivity.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(intent);
                finish();
                return;
            }
        });

        mlogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                LoginUser(memail.getText().toString(), mpassword.getText().toString());
            }
        });

    }

    private void inProgress(boolean x) {
        if (x) {
            mpgbar.setVisibility(View.VISIBLE);
            mlogin.setEnabled(false);
            mregister.setEnabled(false);
        } else {
            mpgbar.setVisibility(View.GONE);
            mlogin.setEnabled(true);
            mregister.setEnabled(true);
        }
    }

    private boolean isEmpty() {
        if (TextUtils.isEmpty(memail.getText().toString())) {
            memail.setError("REQUIRED");
            return true;
        }
        if (TextUtils.isEmpty(mpassword.getText().toString())) {
            mpassword.setError("REQUIRED");
            return true;
        }
        return false;
    }

    private void LoginUser(final String email, final String pwd) {

        if (isEmpty()) return;
        inProgress(true);
        users.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if (!email.isEmpty()) {
                    User login = dataSnapshot.child(email).getValue(User.class);
                    if (login.getType().equals("Admin") && login.getType() != null) {
                        mAuth.signInWithEmailAndPassword(email.replace(",","."), pwd)
                                .addOnSuccessListener(new OnSuccessListener<AuthResult>() {
                                    @Override
                                    public void onSuccess(AuthResult authResult) {
                                        Toast.makeText(SignInActivity.this, "User signed in", Toast.LENGTH_LONG).show();
                                        Intent intent = new Intent(SignInActivity.this, AdminPage.class);
                                        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                                        startActivity(intent);
                                        finish();
                                        return;
                                    }
                                }).addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                Toast.makeText(SignInActivity.this, "Sign in failed" + e.getMessage(), Toast.LENGTH_LONG).show();
                            }
                        });
                    } else if (login.getType().equals("User")  && login.getType() != null) {
                        if (isEmpty()) return;
                        inProgress(true);
                        mAuth.signInWithEmailAndPassword(email.replace(",","."), pwd)
                                .addOnSuccessListener(new OnSuccessListener<AuthResult>() {
                                    @Override
                                    public void onSuccess(AuthResult authResult) {
                                        Toast.makeText(SignInActivity.this, "User signed in", Toast.LENGTH_LONG).show();
                                        Intent intent = new Intent(SignInActivity.this, Home.class);
                                        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                                        startActivity(intent);
                                        finish();
                                        return;
                                    }
                                }).addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                Toast.makeText(SignInActivity.this, "Sign in failed" + e.getMessage(), Toast.LENGTH_LONG).show();
                            }
                        });
                    }
                    else
                        {
                            Toast.makeText(SignInActivity.this, "Sign in failed" , Toast.LENGTH_LONG).show();
                        }

                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });


    }
}

它应该将用户重定向到主页并将管理员重定向到管理页面。但它总是崩溃。

标签: androidfirebase-realtime-database

解决方案


您正在加载整个/User节点,然后尝试从中读取一个User.class。这行不通,因为/User包含多个用户。但是您还需要首先查询下面的子项,/User以仅读取具有您正在寻找的电子邮件地址的用户。

像这样的东西:

private void LoginUser(final String email, final String pwd) {
    Query query = users.orderByChild("email").equalTo(email)
    query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot userSnapshot: dataSnapshot.getChildren()) {
                User login = userSnapshot.getValue(User.class);
                    ...
                }
            }
        }
    });
}

主要区别:

  • 这不是加载所有用户,而是查询/User与电子邮件地址匹配的孩子。
  • 里面onDataChange可能有多个匹配的子节点,所以我们循环这些结果。
  • 删除了child("email")内部,因为如果您尝试读取整个对象onDataChange,那将不起作用。User

推荐阅读