Firebase认证正常,但实时数据库无法读写数据求助
Firebase实时数据库无法读写排查与修复
问题背景
Firebase Authentication功能正常,但无法在Firebase实时数据库中存储和读取数据。已尝试多种方案仍未解决,当前使用锁定模式+美国服务器,以下是相关配置与代码:
当前Firebase实时数据库规则
{ "rules": { ".read": "true", // 2022-8-22 ".write": "true" } }
SignUp Activity代码
class SignUpActivity : AppCompatActivity() { private lateinit var mAuth : FirebaseAuth private lateinit var mDBRef : DatabaseReference private lateinit var binding: ActivitySignIntoBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivitySignIntoBinding.inflate(layoutInflater) setContentView(binding.root) mAuth = FirebaseAuth.getInstance() binding.edtSignUp.setOnClickListener{ val name = binding.edtName.text.toString() val email = binding.edtEmail.text.toString() val password = binding.edtPassword.text.toString() signUp(name, email, password) } binding.tvLogin.setOnClickListener { val intent = Intent(this, Login::class.java) finish() startActivity(intent) } } private fun signUp(name: String, email: String, password: String) { mAuth.createUserWithEmailAndPassword(email, password) .addOnCompleteListener(this) { task -> if (task.isSuccessful) { addUserToDatabase(name, email, mAuth.currentUser?.uid!!) val intent = Intent(this@SignUpActivity, MainActivity::class.java) startActivity(intent) } else { Toast.makeText(this@SignUpActivity, "Some Error Occurred. Try Again", Toast.LENGTH_LONG ).show() } } } private fun addUserToDatabase(name: String, email: String, uid: String) { mDBRef = FirebaseDatabase.getInstance("https://chatapplication-ad542-default-rtdb.firebaseio.com/").getReference() mDBRef.child("User").child(uid).push().setValue(User(name, email, uid)) } }
问题排查与修复方案
1. 数据写入路径错误
当前代码中使用push()方法会在User/{uid}下生成随机ID节点,而非直接将数据存储在UID节点下。若预期每个用户数据对应自己的UID节点,需移除push():
private fun addUserToDatabase(name: String, email: String, uid: String) { mDBRef = FirebaseDatabase.getInstance("https://chatapplication-ad542-default-rtdb.firebaseio.com/").getReference() mDBRef.child("User").child(uid).setValue(User(name, email, uid)) }
2. User类序列化问题
确保User类符合Firebase序列化要求:
- 必须包含无参构造函数(Firebase通过反射创建实例)
- 所有需存储的属性要有getter方法(使用Kotlin
data class可自动生成)
示例正确的User类:
data class User( val name: String = "", val email: String = "", val uid: String = "" )
3. 添加错误监听排查问题
临时添加失败监听,可直接获取数据库写入错误信息:
mDBRef.child("User").child(uid).setValue(User(name, email, uid)) .addOnFailureListener { exception -> Log.e("DB_ERROR", "写入失败: ${exception.message}") Toast.makeText(this@SignUpActivity, "数据库写入失败: ${exception.message}", Toast.LENGTH_LONG).show() }
4. 基础配置检查
- 确认
google-services.json文件已正确放置在项目app目录下 - 核对数据库URL与Firebase控制台显示的地址完全一致
- 确保设备网络连接稳定,Firebase实时数据库依赖网络交互
内容的提问来源于stack exchange,提问作者Anshul Jain
相关产品推荐
相关产品推荐

