简体   繁体   English

Android 和 Firebase 将 EditText 与实时数据库子值进行比较

[英]Android & Firebase comparing EditText to realtime database child value

This question has been asked at: Comparing EditText string with firebase database's child value and I am using that as a guide but coming into problems which were not solved there.已在以下位置提出此问题: 将 EditText 字符串与 firebase 数据库的子值进行比较,我将其用作指南,但遇到了未在那里解决的问题。 I know Firebase offers authentication options, but I need to use realtime for the moment.我知道 Firebase 提供身份验证选项,但目前我需要使用实时。 I am looking to compare 2 values entered in my username and password EditTexts to the child values in my realtime database "Users".我希望将在我的用户名和密码 EditTexts 中输入的 2 个值与我的实时数据库“用户”中的子值进行比较。

When i run my code I get an当我运行我的代码时,我得到一个

Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference尝试在空对象引用上调用虚拟方法“java.lang.String java.lang.Object.toString()”

I'm assuming that either/both username1 and/or password1 are null and this is why my code is failing to run.我假设 username1 和/或 password1 都为空,这就是我的代码无法运行的原因。

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) {

                    }
                });

. . I have both my read and write rules set to true.我的读取和写入规则都设置为 true。 I'm new to coding so any help would be greatly appreciated.我是编码新手,因此将不胜感激任何帮助。 Thanks so much!非常感谢!

The key is in this snippet of code:关键就在这段代码中:

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();

Since you're loading from /Users , the dataSnapshot contains the data for all users.由于您是从/Users加载的,因此dataSnapshot包含所有用户的数据。 Each user's username and password are in a child node under dataSnapshot , which your code needs to handle.每个用户的usernamepassword都在dataSnapshot下的子节点中,您的代码需要处理该子节点。

The simplest way to do that from your current code is:从您当前的代码中做到这一点的最简单方法是:

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);
        }

The big differences here are:这里的主要区别是:

  • I loop over the child nodes of the data snapshot to get to the snapshot for each individual user.我遍历数据快照的子节点以获取每个用户的快照。
  • I use getValue(String.class) , which will only return a value if username exists.我使用getValue(String.class) ,如果username存在,它只会返回一个值。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM