Android Studio中Firebase实时数据库无法写入数据求助
Firebase实时数据库无数据写入问题排查
我用Firebase在Android Studio开发登录注册页面,代码编译正常,但实时数据库里看不到任何数据。已经按Firebase文档完成所有配置,应用也成功连接Firebase(依赖和插件都已添加)。作为新手,求指导。
登录Activity代码
public class MainActivity extends AppCompatActivity { TextView signuptext; Button loginbtn; TextInputLayout username_var, password_var; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); loginbtn = findViewById(R.id.loginbutton); password_var = findViewById(R.id.passwordtext_field_design); username_var = findViewById(R.id.emailtext_field_design); signuptext = findViewById(R.id.createaccount); ProgressDialog progressDialog = new ProgressDialog(this); signuptext.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(getApplicationContext(), SignUp.class); startActivity(intent); finish(); } }); loginbtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(),0); String password_ = password_var.getEditText().getText().toString().trim(); String username_ = username_var.getEditText().getText().toString().trim(); progressDialog.setTitle("Login"); progressDialog.setMessage("In Progess...please wait"); progressDialog.show(); if (!username_.isEmpty()){ username_var.setError(null); username_var.setErrorEnabled(false); if (!password_.isEmpty()) { password_var.setError(null); password_var.setErrorEnabled(false); final String username_data = username_var.getEditText().getText().toString().trim(); final String password_data = password_var.getEditText().getText().toString().trim(); FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance(); DatabaseReference databaseReference = firebaseDatabase.getReference("datauser"); Query check_username = databaseReference.orderByChild("username").equalTo(username_data); check_username.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { if(snapshot.exists()){ username_var.setError(null); username_var.setErrorEnabled(false); String passwordcheck = snapshot.child(username_data).child("password").getValue(String.class); if(passwordcheck.equals(password_data)){ password_var.setError(null); password_var.setErrorEnabled(false); Toast.makeText(MainActivity.this,"Register Successfully", Toast.LENGTH_SHORT).show(); progressDialog.show(); Intent intent = new Intent(getApplicationContext(),Final.class); startActivity(intent); finish(); } } } @Override public void onCancelled(@NonNull DatabaseError error) { } }); }else{ username_var.setError("Email is not Registered"); } }else{ password_var.setError("Wrong Password"); } } }); } }
注册Activity代码
public class SignUp extends AppCompatActivity { TextView logintext; TextInputLayout fullname_var, username_var, email_var, phonenumber_var, password_var; FirebaseDatabase firebaseDatabase; DatabaseReference reference; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_signup); fullname_var = findViewById(R.id.fullname_field); username_var = findViewById(R.id.username_field); email_var = findViewById(R.id.email_field); phonenumber_var = findViewById(R.id.phoneno_field); password_var = findViewById(R.id.password_field); logintext = findViewById(R.id.Signintext); logintext.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(getApplicationContext(), MainActivity.class); startActivity(intent); finish(); } }); } public void registerbuttonclick(View view) { InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromInputMethod(view.getWindowToken(), 0); String fullname_ = fullname_var.getEditText().getText().toString().trim(); String username_ = username_var.getEditText().getText().toString().trim(); String email_ = email_var.getEditText().getText().toString().trim(); String phonenumber_ = phonenumber_var.getEditText().getText().toString().trim(); String password_ = password_var.getEditText().getText().toString().trim(); if (!fullname_.isEmpty()) { fullname_var.setError(null); fullname_var.setErrorEnabled(false); if (!username_.isEmpty()) { username_var.setError(null); username_var.setErrorEnabled(false); if (!email_.isEmpty()) { email_var.setError(null); email_var.setErrorEnabled(false); if (!phonenumber_.isEmpty()) { phonenumber_var.setError(null); phonenumber_var.setErrorEnabled(false); if (!password_.isEmpty()) { password_var.setError(null); password_var.setErrorEnabled(false); if (!email_.matches("/^\\w+([\\.-]?\\w+)*@\\w+([\\.-]?\\w+)*(\\.\\w{2,3})+$/")) { FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance(); DatabaseReference reference = firebaseDatabase.getReference("datauser"); String fullname_s = fullname_var.getEditText().getText().toString().trim(); String email_s = email_var.getEditText().getText().toString().trim(); String phonenumber_s = phonenumber_var.getEditText().getText().toString().trim(); String password_s = password_var.getEditText().getText().toString().trim(); String username_s = username_var.getEditText().getText().toString().trim(); Datastorage storingdata = new Datastorage(fullname_s, username_s, email_s, password_s, phonenumber_s); reference.child(username_s).setValue(storingdata); Toast.makeText(this, "Register Successfully", Toast.LENGTH_SHORT).show(); Intent intent = new Intent(getApplicationContext(), MainActivity.class); startActivity(intent); finish(); } else { email_var.setError("Invalid Email"); } } else { password_var.setError("Please enter the Password"); } } else { phonenumber_var.setError("Please enter the Phone Number"); } } else { fullname_var.setError("Please enter the Name"); } } } } }
数据模型类代码
public class Datastorage { private String name; private String username; private String email; private String phoneno; private String password; public Datastorage() { } public Datastorage(String name,String username, String email, String phoneno, String password){ this.name =name; this.email =email; this.phoneno =phoneno; this.password =password; this.username =username; } public String getName() { return name; } public String getUsername() { return username; } public String getEmail() { return email; } public String getPassword() { return password; } public String getPhoneno() { return phoneno; } public void setEmail(String email) { this.email = email; } public void setName(String name) { this.name = name; } public void setPassword(String password) { this.password = password; } public void setUsername(String password) { this.password = password; } public void setPhoneno(String phoneno) { this.phoneno = phoneno; } }
Logcat截图

问题排查与修复步骤
- 邮箱验证逻辑完全倒置
注册代码中,邮箱格式判断条件写反了:原代码是邮箱格式不符合时才写入数据,正确逻辑应为邮箱格式匹配时执行写入。同时Java的matches方法不需要加前后斜杠/(这是JavaScript写法),修正后代码:
if (email_.matches("^\\w+([\\.-]?\\w+)*@\\w+([\\.-]?\\w+)*(\\.\\w{2,3})+$")) { // 写入数据库逻辑 }
- 数据模型类setUsername方法错误
模型类中setUsername方法把参数错误赋值给password变量,导致username字段无法正确存储,修正:
public void setUsername(String username) { this.username = username; }
- 数据库权限配置检查
默认Firebase实时数据库规则仅允许认证用户读写,测试阶段可临时开放权限(上线前必须改回安全规则):
{ "rules": { ".read": true, ".write": true } }
- 注册空判断分支提示错误
邮箱为空的else分支错误提示"请输入姓名",应改为提示邮箱为空:
} else { email_var.setError("Please enter the Email"); }
- 登录错误提示逻辑混乱
登录时空判断的错误提示完全不对应场景,修正:
if (!username_.isEmpty()){ username_var.setError(null); username_var.setErrorEnabled(false); if (!password_.isEmpty()) { // 登录逻辑 } else { password_var.setError("请输入密码"); } } else { username_var.setError("请输入用户名/邮箱"); }
内容的提问来源于stack exchange,提问作者UncannyHarmony
相关产品推荐
相关产品推荐

