【问题标题】:loggin with realtime database Firebase ( Android Studio)使用实时数据库 Firebase (Android Studio) 进行日志记录
【发布时间】:2022-11-11 07:11:58
【问题描述】:

所以我想用某个角色登录,我尝试用用户角色登录,但它总是进入else条件,因为snapshot.child(uid).child("role").equals("user")这个条件总是假的。这个问题有什么解决办法吗?

this is my database structure

这是我的代码:

package com.example.finalproject2;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.util.Patterns;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.Switch;
import android.widget.TextView;
import android.widget.Toast;

import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

public class LoginScreenUser extends AppCompatActivity implements View.OnClickListener{

    private TextView phone,pass;
    private Button button;
    private ProgressBar progressBar;
    private FirebaseAuth mAuth;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login_screen);

        phone = (TextView) findViewById(R.id.nomorTelp);
        pass = (TextView) findViewById(R.id.passUser);
        button = (Button) findViewById(R.id.loginUser);
        progressBar = (ProgressBar) findViewById(R.id.loads);
        button.setOnClickListener(this);
        progressBar.setVisibility(View.GONE);
    }

    @Override
    public void onClick(View v) {
        switch(v.getId()){
            case R.id.loginUser:
                userlogin();
        }
    }

    private void userlogin() {
        String nomor = phone.getText().toString().trim();
        String password = pass.getText().toString().trim();


//        progressBar.setVisibility(View.VISIBLE);
        String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
        DatabaseReference DatabaseReference = FirebaseDatabase.getInstance().getReference();
        DatabaseReference.child("Users").orderByChild("role").equalTo("user").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                if (snapshot.child(nomor).exists()  && snapshot.child(password).exists() && snapshot.child(uid).child("role").equals("user")){
                    Toast.makeText(LoginScreenUser.this,"Login Succes",Toast.LENGTH_SHORT).show();
                    back();
                }else{
                    Toast.makeText(LoginScreenUser.this,"Data Belum Terdaftar",Toast.LENGTH_SHORT).show();
                }
            }
            @Override
            public void onCancelled(@NonNull DatabaseError error) {
            }
        });
    }
    private void back() {
        startActivity(new Intent(this,MainActivity.class));
    }
}

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:
    loginBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
    
                final String phoneTxt = phone.getText().toString();
                final String passwordTxt = password.getText().toString();
    
                if (phoneTxt.isEmpty() || passwordTxt.isEmpty()){
                    Toast.makeText(Login.this, "Please Enter Your Phone Number Or Password", Toast.LENGTH_SHORT).show();
                }else {
    
                    databaseReference.child("users").addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot snapshot) {
                            if (snapshot.hasChild(phoneTxt)){
                                final String getpassword = snapshot.child(phoneTxt).child("password").getValue(String.class);
    
                                if (getpassword.equals(passwordTxt)){
                                    Toast.makeText(Login.this, "Successfully login! ", Toast.LENGTH_SHORT).show();
                                    startActivity(new Intent(Login.this,HomeScreen.class));
                                    finish();
                                }
                                else{
                                    Toast.makeText(Login.this, "Wrong Password", Toast.LENGTH_SHORT).show();
                                }
                            }
                            else {
                                Toast.makeText(Login.this, "Wrong Phone Number!", Toast.LENGTH_SHORT).show();
                            }
                        }
    
                        @Override
                        public void onCancelled(@NonNull DatabaseError error) {
    
                        }
                    });
                }
            }
        });
    

    我已经做到了。我认为这对你有帮助。

    【讨论】:

      【解决方案2】:

      当您使用时:

      snapshot.child(uid).child("role").equals("user")
      

      这基本上意味着您尝试检查上述参考的完整位置 URL 是否等于“用户”。这显然总是错误的,因为该 URL 永远不会等于“用户”字符串。 DatabaseReference 类的 toString() 方法返回:

      此参考的完整位置 URL。

      要解决此问题,您必须将与role 字段对应的值作为字符串获取:

      snapshot.child(uid).child("role").getValue(String.class).equals("user")
      //                                 ?
      

      【讨论】:

        猜你喜欢
        • 2011-03-06
        • 2012-02-08
        • 1970-01-01
        • 2023-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-11
        相关资源
        最近更新 更多