在以下位置已问过这个问题:Comparing EditText string with firebase database's child value,我正在以此为指南,但是遇到了在那里尚未解决的问题。我知道Firebase提供了身份验证选项,但是我暂时需要使用实时。我希望将在用户名和密码EditTexts中输入的2个值与实时数据库“用户”中的子值进行比较。



当我运行代码时,我得到一个


尝试在空对象引用上调用虚拟方法'java.lang.String java.lang.Object.toString()'


我假设username1和/或password1均为null,这就是为什么我的代码无法运行的原因。

logUsername = findViewById(R.id.etLoginUsers);
logPassword = findViewById(R.id.etLoginPassword);

FirebaseApp.initializeApp(this);
final DatabaseReference mDatabaseRef = FirebaseDatabase.getInstance().getReference().child("Users");

    btnLogin.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

                final String username = logUsername.getText().toString().trim();
                final String password = logPassword.getText().toString().trim();
                mDatabaseRef.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                        String username1 = dataSnapshot.child("username").getValue().toString();
                        String password1 = dataSnapshot.child("password").getValue().toString();

                        if (username.equals(username1) & password.equals(password1)){
                            Intent intSignIn = new Intent(MainActivity.this, HomeActivity.class);
                            startActivity(intSignIn);
                        } else {
                            Toast.makeText(MainActivity.this, "Incorrect Login Details", Toast.LENGTH_SHORT).show();
                        }
                    }

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

                    }
                });


。我的读写规则都设置为true。我是编码新手,因此不胜感激。非常感谢!

最佳答案

关键在以下代码片段中:

final DatabaseReference mDatabaseRef = FirebaseDatabase.getInstance().getReference().child("Users");
mDatabaseRef.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        String username1 = dataSnapshot.child("username").getValue().toString();
        String password1 = dataSnapshot.child("password").getValue().toString();


由于您是从/Users加载的,因此dataSnapshot包含所有用户的数据。每个用户的usernamepassword都在dataSnapshot下的子节点中,您的代码需要处理该子节点。

从当前代码执行此操作的最简单方法是:

final DatabaseReference mDatabaseRef = FirebaseDatabase.getInstance().getReference().child("Users");
mDatabaseRef.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        for (DataSnapshot userSnapshot: dataSnapshot.getChildren()) {
            String username1 = userSnapshot.child("username").getValue(String.class);
            String password1 = dataSnapshot.child("password").getValue(String.class);
        }


这里的最大区别是:


我遍历数据快照的子节点以获取每个用户的快照。
我使用getValue(String.class),如果username存在,它只会返回一个值。

10-01 09:33
查看更多