Android Kotlin中如何根据userId从Firebase获取对应用户数据?
Firebase Realtime Database 按用户ID拉取个人资料解决方案
现存问题梳理
- 未校验登录状态、未给
uid变量赋值,无法匹配到对应用户的节点 - 直接对UID对应的整体用户节点读取字符串类型值,该节点是包含
first_name、email等多个字段的结构化数据,类型不匹配会导致读取返回空 - 监听整个
Users节点会拉取所有用户的数据,既浪费带宽也不符合数据权限要求
修正后实现代码
auth = FirebaseAuth.getInstance() // 先校验用户登录状态 val loggedUser = auth.currentUser if (loggedUser == null) { Log.e("Firebase", "用户未登录,无法加载个人资料") return } val uid = loggedUser.uid // 直接定位到当前登录用户的专属节点,无需监听全量用户数据 val userRef = FirebaseDatabase.getInstance().getReference("Users").child(uid) userRef.addValueEventListener(object: ValueEventListener{ override fun onDataChange(snapshot: DataSnapshot) { if (!snapshot.exists()) { Log.e("Firebase", "对应用户数据不存在") return } // 单独读取对应字段的字符串值 val firstName = snapshot.child("first_name").getValue(String::class.java) Log.e("first_name", firstName ?: "未设置名字") // 其余字段同理读取即可,示例: val lastName = snapshot.child("last_name").getValue(String::class.java) val email = snapshot.child("email").getValue(String::class.java) } override fun onCancelled(error: DatabaseError) { // 打印错误信息用于排查问题,常见错误包括权限不足、网络异常等 Log.e("FirebaseError", "数据读取失败:${error.message}") } })
额外注意事项
请先确认你的实时数据库权限规则允许用户读取自己的节点,参考规则如下:
{ "rules": { "Users": { "$uid": { ".read": "$uid === auth.uid", ".write": "$uid === auth.uid" } } } }
按照上述方案调整后即可正常拉取当前登录用户的个人资料信息。
内容的提问来源于stack exchange,提问作者Nadish
相关产品推荐
相关产品推荐

