【问题标题】:Android & Firebase comparing EditText to realtime database child valueAndroid 和 Firebase 将 EditText 与实时数据库子值进行比较
【发布时间】:2020-01-09 17:31:06
【问题描述】:

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

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

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

我假设 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) {

                    }
                });

。我的读写规则都设置为 true。我是编码新手,所以任何帮助将不胜感激。非常感谢!

【问题讨论】:

    标签: java android firebase firebase-realtime-database firebase-authentication


    【解决方案1】:

    关键就在这段代码的sn-p中:

    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 存在时返回一个值。

    【讨论】:

    • 嗨弗兰克。谢谢回复。当更改我的代码以包含上面的 for 循环时,下面的 if 语句中的 username1 和 password1 都会变成红色,并带有“无法解析符号”。 if (username.equals(username1) & password.equals(password1)){ Intent intSignIn = new Intent(MainActivity.this, HomeActivity.class); startActivity(intSignIn); } 有什么想法可以解决这个问题吗?
    • 我尝试将 if 语句放入 for 循环中,它只显示登录不成功的 Toast @Frank
    • 我将这个if (username.equals(username1) & password.equals(password1)){ 更改为这个if (username1.equals(username) & password1.equals(password)){,它现在可以工作了!非常感谢您的帮助!
    猜你喜欢
    • 2023-03-04
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多