Android新手求助:如何获取Firebase当前用户ID对应的生成ID节点
解决Firebase中获取当前用户对应节点的问题
嘿,刚接触Android Firebase开发的话别慌~我先帮你梳理下代码里的小问题,再一步步教你实现获取当前用户对应节点的需求。
首先看你现有代码里的几个明显问题:
- 你已经通过
user.getUid()拿到了当前用户的UID并存进userKey,但后续代码里用了未定义的currentuser变量,这会直接报错,得把它换成userKey .getRef()在这里是多余的,因为mDb.child("students").child(userKey)已经是对应节点的DatabaseReference了,不需要额外调用这个方法
接下来分两种常见的数据库结构给你演示实现方式:
情况1:直接用Firebase Auth UID作为students下的节点Key
如果你的数据库结构是直接把用户UID作为节点名称:
students |--- abc123(你的用户UID) |--- level: "初中" |--- name: "张三"
这种情况下,你要的节点ID就是userKey本身,修正后的代码如下:
FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(); FirebaseDatabase mDatabase = FirebaseDatabase.getInstance(); DatabaseReference mDb = mDatabase.getReference(); FirebaseUser user = firebaseAuth.getCurrentUser(); // 先判断用户是否已登录,避免空指针异常 if (user != null) { final String userKey = user.getUid(); mDb.child("students").child(userKey).addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { // 获取节点的完整引用路径 String referencePath = dataSnapshot.getRef().toString(); // 获取节点的Key(也就是当前用户的UID) String nodeId = dataSnapshot.getKey(); // 获取level字段的值 String userLevel = dataSnapshot.child("level").getValue(String.class); // 把需要的内容显示到TextView textViewStudentName.setText("节点ID:" + nodeId + "\n路径:" + referencePath + "\n等级:" + userLevel); } @Override public void onCancelled(DatabaseError databaseError) { // 别忘了处理错误情况,比如打印日志 Log.e("FirebaseError", "数据获取失败:" + databaseError.getMessage()); } }); } else { // 用户未登录的处理逻辑 textViewStudentName.setText("请先登录"); }
情况2:students下是自动生成的Push ID节点,节点内存储用户UID
如果你的数据库结构是用push()生成的自动ID,每个节点里包含用户UID:
students |--- -NxYabc123(自动生成的Push ID) |--- uid: "abc123"(你的用户UID) |--- level: "初中" |--- name: "张三"
这种情况下,你需要先查询出uid等于当前用户UID的节点,再获取对应的自动生成ID,代码如下:
FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(); FirebaseDatabase mDatabase = FirebaseDatabase.getInstance(); DatabaseReference mDb = mDatabase.getReference(); FirebaseUser user = firebaseAuth.getCurrentUser(); if (user != null) { final String userKey = user.getUid(); // 查询students节点下uid等于当前用户UID的节点 mDb.child("students").orderByChild("uid").equalTo(userKey).addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { // 遍历查询结果(一般一个用户对应一个节点,所以循环只会执行一次) for (DataSnapshot snapshot : dataSnapshot.getChildren()) { // 获取自动生成的Push ID String autoGeneratedNodeId = snapshot.getKey(); // 获取level字段的值 String userLevel = snapshot.child("level").getValue(String.class); textViewStudentName.setText("自动生成节点ID:" + autoGeneratedNodeId + "\n等级:" + userLevel); } } @Override public void onCancelled(DatabaseError databaseError) { Log.e("FirebaseError", "查询失败:" + databaseError.getMessage()); } }); } else { textViewStudentName.setText("请先登录"); }
最后提醒下:要确保你的Firebase数据库规则设置正确,允许当前用户访问自己的数据,比如可以用这样的规则:
{ "rules": { "students": { "$studentId": { ".read": "auth != null && auth.uid === data.child('uid').val()", ".write": "auth != null && auth.uid === data.child('uid').val()" } } } }
内容的提问来源于stack exchange,提问作者HK_92
相关产品推荐
相关产品推荐

