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

Firebase实时数据库无法获取登录用户数据求助

Firebase实时数据库获取登录用户数据失败排查与解决

问题描述

作为Firebase实时数据库新手,尝试获取当前登录用户的数据,查阅官方文档后仍无法成功获取。相关代码及数据库信息如下:

Header.kt 代码

private lateinit var binding: HeaderBinding
private lateinit var auth:FirebaseAuth

private lateinit var userName: TextView
private lateinit var userEmail: TextView

private lateinit var database: DatabaseReference

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = HeaderBinding.inflate(layoutInflater)
    setContentView(R.layout.header)

    database = Firebase.database.reference

    userName = findViewById(R.id.userName)
    userEmail = findViewById(R.id.userEmail)

    val userID = FirebaseAuth.getInstance().currentUser!!.uid

    database.child("users").child(userID).get().addOnSuccessListener {
        val email = it.child("email").value.toString()
        val username = it.child("username").value.toString()

        userName.text = username
        userEmail.text =  email
    }.addOnFailureListener{
        Toast.makeText(this, "Error", Toast.LENGTH_SHORT).show()
    }
}

Header.xml 布局代码

<androidx.constraintlayout.widget.ConstraintLayout>
    <TextView
        android:id="@+id/userName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:fontFamily="@font/baloo"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:textColor="#FFFFFF"
        android:textSize="24sp" />

    <TextView
        android:id="@+id/userEmail"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:fontFamily="@font/aclonica"
        android:textColor="#FFFFFF"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:textSize="14sp" />
</androidx.constraintlayout.widget.ConstraintLayout>

Firebase数据库结构

数据库中users节点下的用户数据结构:

  • users
    • [用户UID]
      • email: "xxx@xxx.com"
      • username: "用户名"

问题排查与解决方案

1. 检查数据库权限规则

Firebase实时数据库默认权限限制严格,若规则配置错误会导致读取失败。确保规则允许当前登录用户访问自己的节点:

{
  "rules": {
    "users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      }
    }
  }
}

测试阶段可临时开放全权限(正式环境禁止):

{
  "rules": {
    ".read": true,
    ".write": true
  }
}

2. 修正布局重叠问题

布局中两个TextView的app:layout_constraintTop_toTopOf="parent"设置完全相同,会导致控件重叠,看起来像是没有加载数据。修改userEmail的约束:

<TextView
    android:id="@+id/userEmail"
    ...
    app:layout_constraintTop_toBottomOf="@+id/userName" />

3. 空值安全处理

当数据库中字段为null时,直接调用toString()会显示"null"字符串,需添加空值判断:

database.child("users").child(userID).get().addOnSuccessListener {
    val username = it.child("username").value?.toString() ?: "未知用户名"
    val email = it.child("email").value?.toString() ?: "未知邮箱"

    userName.text = username
    userEmail.text = email
}

4. 增加登录状态校验

代码中直接使用currentUser!!.uid会在用户未登录时抛出空指针异常,先校验用户状态:

val currentUser = FirebaseAuth.getInstance().currentUser
if (currentUser != null) {
    val userID = currentUser.uid
    // 执行数据读取逻辑
} else {
    Toast.makeText(this, "请先登录", Toast.LENGTH_SHORT).show()
    // 可跳转至登录页
}

5. 添加调试日志定位问题

在回调中添加日志,方便查看具体错误原因:

.addOnSuccessListener {
    Log.d("FirebaseDebug", "获取到的数据: ${it.value}")
    // 赋值逻辑
}.addOnFailureListener{
    Log.e("FirebaseDebug", "读取失败", it)
    Toast.makeText(this, "读取失败: ${it.message}", Toast.LENGTH_SHORT).show()
}

内容的提问来源于stack exchange,提问作者kuyajik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 04:10:32