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

Firebase数据库读取返回null:Android应用Profile页无法加载用户数据

问题原因及解决方案

问题核心

从你的Firebase数据库结构、代码逻辑和Logcat输出能明确两个关键问题:

  1. 节点键不匹配:代码中用firebaseAuth.uid!!作为Users节点的子节点键查询数据,但你的数据库里Users下的子节点键是用户邮箱地址,而非Firebase Auth生成的UID。Logcat显示Snapshot: DataSnapshot { key = [你的UID], value = null },说明Firebase找不到对应UID的节点,自然返回null。
  2. 字段名大小写不匹配:数据库里的字段是首字母大写的Email、Username、ID,但原代码里用的是小写的email、username、id,即使节点路径正确,也获取不到对应字段的值。

解决方案

你可以根据需求选择以下两种修复方式:

方式1:修改查询逻辑,适配现有数据库结构

如果要保留以邮箱作为用户节点键的结构,修改loadUserDetails函数如下:

private fun loadUserDetails() {
    val dbRef = FirebaseDatabase.getInstance().getReference("Users")
    // 安全获取当前用户邮箱,为空则直接返回
    val userEmail = firebaseAuth.currentUser?.email ?: return

    dbRef.child(userEmail)
        .addValueEventListener(object: ValueEventListener{
            override fun onDataChange(snapshot: DataSnapshot) {
                Log.d("FirebaseData", "Snapshot: $snapshot")

                // 匹配数据库字段大小写,同时安全处理null值
                val email = snapshot.child("Email").value?.toString() ?: ""
                val username = snapshot.child("Username").value?.toString() ?: ""
                val uid = snapshot.child("ID").value?.toString() ?: ""

                Log.d("FirebaseData", "Email: $email, Username: $username, UID: $uid")

                binding.profileUID.text = uid
                binding.profileEmail.text = email
                binding.profileUsername.text = username
            }

            override fun onCancelled(error: DatabaseError) {
                Log.e("FirebaseError", "Error: $error")
            }
        })
}

方式2:重构数据存储结构(推荐,符合Firebase最佳实践)

使用Firebase Auth的UID作为用户节点键更合理(避免邮箱变更导致的数据关联失效),需要先修改数据写入逻辑,将用户数据存入Users/[UID]节点:

// 示例:写入用户数据到数据库
val userData = mapOf(
    "email" to firebaseAuth.currentUser?.email,
    "username" to "JohnVillamor",
    "id" to firebaseAuth.currentUser?.uid
)
FirebaseDatabase.getInstance().getReference("Users")
    .child(firebaseAuth.uid!!)
    .setValue(userData)

之后只需修正原查询代码的字段名大小写问题即可:

// 在onDataChange中修改字段获取逻辑
val email = snapshot.child("email").value?.toString() ?: ""
val username = snapshot.child("username").value?.toString() ?: ""
val uid = snapshot.child("id").value?.toString() ?: ""

额外注意事项

  • 避免直接调用value.toString(),如果value为null会触发空指针异常,改用value?.toString() ?: ""做安全处理。
  • 检查Firebase数据库规则,确保当前用户拥有Users节点的读取权限,避免因权限限制导致数据获取失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 16:50:14