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: "用户名"
- [用户UID]
问题排查与解决方案
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
相关产品推荐
相关产品推荐

