【问题标题】:Failed to convert value of type String on Realtime Database无法在实时数据库上转换字符串类型的值
【发布时间】:2021-10-08 01:24:22
【问题描述】:

我正在尝试进行管理员登录,但我的登录活动一直给我错误,有两种方法可以登录管理员,他们会点击另一个文本视图来更改一些设置然后登录...登录对用户来说很好,但是管理员它一直给我错误..

我的登录活动:

private TextView register;
private Button login;
private TextInputLayout phoneNum, inputPassword;
private ProgressDialog loadingDialog;
private TextView adminLink, notAdminLink, title;

private String parentDbName = "Users";
private CheckBox rememberMe;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);
    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);

    loadingDialog = new ProgressDialog(this);
    title = findViewById(R.id.title);

    //Button
    register = findViewById(R.id.register);
    login = findViewById(R.id.loginBtn);
    //EditText
    phoneNum = findViewById(R.id.login_phone_num);
    inputPassword = findViewById(R.id.login_passBox);

    //Checkbox
    rememberMe = findViewById(R.id.remember_me_chk);

    //admin
    adminLink = findViewById(R.id.admin_link);
    notAdminLink = findViewById(R.id.not_admin);

    
    register.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            startActivity(new Intent(LoginActivity.this, RegisterActivity.class));
            finish();
        }
    });

    //CheckBox EVERY time app start
    SharedPreferences preferences = getSharedPreferences("checkBox", MODE_PRIVATE);
    String checkBox = preferences.getString("remember", "");

    if (checkBox.equals("true")) {
        startActivity(new Intent(LoginActivity.this, MainActivity.class));
        finish();
    } else if (checkBox.equals("false")) {
        Toast.makeText(this, "Please Sign In.", Toast.LENGTH_SHORT).show();
    }

    login.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            LoginUser();
        }
    });

    // Automatically Login
    rememberMe.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
            if (compoundButton.isChecked()) {
                SharedPreferences preferences = getSharedPreferences("checkBox", MODE_PRIVATE);
                SharedPreferences.Editor editor = preferences.edit();
                editor.putString("remember", "true");
                editor.apply();

            } else if (!compoundButton.isChecked()){
                SharedPreferences preferences = getSharedPreferences("checkBox", MODE_PRIVATE);
                SharedPreferences.Editor editor = preferences.edit();
                editor.putString("remember", "false");
                editor.apply();
            }
        }
    });


    //Admins
    adminLink.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            login.setText(R.string.Admin_login);
            title.setText(R.string.admin_panel_title);
            rememberMe.setVisibility(View.INVISIBLE);
            adminLink.setVisibility(View.INVISIBLE);
            notAdminLink.setVisibility(View.VISIBLE);
            parentDbName = "Admins";
        }
    });

    notAdminLink.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            login.setText(R.string.login);
            title.setText(R.string.login);
            rememberMe.setVisibility(View.VISIBLE);
            adminLink.setVisibility(View.VISIBLE);
            notAdminLink.setVisibility(View.INVISIBLE);
            parentDbName = "Users";
        }
    });
}

private void LoginUser() {
    String phone = phoneNum.getEditText().getText().toString();
    String pass = inputPassword.getEditText().getText().toString();

    if (TextUtils.isEmpty(phone)) {
        Toast.makeText(this, "Please Enter Your PhoneNum.", Toast.LENGTH_SHORT).show();
    }  else if (TextUtils.isEmpty(pass)) {
        Toast.makeText(this, "Please Enter Your Password.", Toast.LENGTH_SHORT).show();
    } else {
        loadingDialog.setTitle("Login Your Account...");
        loadingDialog.setMessage("Connecting...");
        // prevent it from disappearing when clicked outside
        loadingDialog.setCanceledOnTouchOutside(false);
        loadingDialog.show();

        AccessAccount(phone,pass);
    }
}
private void AccessAccount(String phone, String pass) {
    final DatabaseReference rootRef;
    rootRef = FirebaseDatabase.getInstance().getReference();
    rootRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
            if (snapshot.child(parentDbName).child(phone).exists()) {
                Users userData = snapshot.child(parentDbName).child(phone).getValue(Users.class);
                if (userData.getPhone().equals(phone)) {
                    if (userData.getPassword().equals(pass)) {
                        if (parentDbName.equals("Admins")) {
                            Toast.makeText(LoginActivity.this, "Admin: " + userData.getName() + "\nWish You have a good Day", Toast.LENGTH_SHORT).show();
                            loadingDialog.dismiss();

                            startActivity(new Intent(LoginActivity.this, AdminCategoryActivity.class));
                            finish();
                        } else if (parentDbName.equals("Users")) {
                            Toast.makeText(LoginActivity.this, "Welcome Back " + userData.getName() + " Wish You have a good Day", Toast.LENGTH_SHORT).show();
                            loadingDialog.dismiss();

                            startActivity(new Intent(LoginActivity.this, MainActivity.class));
                            finish();
                        }
                    } else {
                        Toast.makeText(LoginActivity.this, "Password is Incorrect.", Toast.LENGTH_SHORT).show();
                        loadingDialog.dismiss();
                    }
                }
            } else {
                Toast.makeText(LoginActivity.this, "This phone Number doesn't Exist.", Toast.LENGTH_SHORT).show();
                loadingDialog.dismiss();
            }
        }

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

        }
    });
}

错误信息:

【问题讨论】:

  • Users phone 字段是 String 但在 firebase 中,我猜您将 phone 存储为 Long 。纠正我如果我错了。请包括用户类以及 Firebase 数据以进行说明
  • 请编辑您的问题并将您的数据库结构添加为 JSON 文件。您可以通过单击 Firebase Console 的溢出菜单 (⠇) 中的导出 JSON 来简单地获取它,并指明您想要获取的确切数据。请回复@AlexMamo

标签: android firebase firebase-realtime-database


【解决方案1】:

您在 Firebase 中存储一个字段,并在应用程序端将该字段解析为字符串。该字段很可能是电话

【讨论】:

  • 那么如何将它作为字符串存储在firebase中
  • 您的手机用户模型数据类型应该是字符串不长
【解决方案2】:

*用户 userData = snapshot.child(parentDbName).child(phone).getValue(Users.class);

*在这一行中,您将 textInputLayout 作为子级传递,这是错误

*检查您的 Firebase 数据库中的子名称

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2017-12-30
    相关资源
    最近更新 更多