You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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方法(使用Kotlindata 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 03:15:58