如何检索通过Firebase push()存入的用户详情数据?
用户详情检索方案
关于用orderByKey()实现的可行性
可以用,但当前数据结构下这么做效率极低,完全没必要。
当前数据结构的问题
你现在的写入逻辑是在users下先创建随机pushID,再在pushID下以用户UID为键存储数据,结构为users/{pushId}/{uid}/{用户字段}。这种多层嵌套结构会让检索变得繁琐——你得先遍历所有pushID,才能找到对应UID的节点。
更高效的写法(推荐)
直接把用户UID作为users的子节点键,不需要用push(),写入和检索都能一步到位:
修改后的写入代码
final refDataInstance = FirebaseDatabase.instance.ref().child("users"); // 直接用当前用户UID作为节点键,跳过push()生成随机ID的步骤 refDataInstance.child(FirebaseAuth.instance.currentUser!.uid).set({ "email": FirebaseAuth.instance.currentUser?.email, "uid": FirebaseAuth.instance.currentUser?.uid, "password": _passwordController.text, "type": "trainers", "status": "Unavailable", });
检索用户详情的代码
直接通过UID定位节点读取数据即可:
final userRef = FirebaseDatabase.instance.ref().child("users/${FirebaseAuth.instance.currentUser!.uid}"); userRef.once().then((snapshot) { if (snapshot.exists) { Map<String, dynamic> userData = snapshot.value as Map<String, dynamic>; String email = userData["email"]; String status = userData["status"]; String type = userData["type"]; // 后续处理用户数据逻辑 } });
若坚持原有结构,用orderByKey()检索的方法
如果不想调整数据结构,要通过orderByKey()找到对应UID的节点,需要遍历所有push节点下的子节点,性能很差,仅作参考:
final usersRef = FirebaseDatabase.instance.ref().child("users"); usersRef.once().then((snapshot) { if (snapshot.exists) { Map<String, dynamic> pushNodes = snapshot.value as Map<String, dynamic>; // 遍历每个push生成的节点 pushNodes.forEach((pushId, value) { DatabaseReference userNodeRef = usersRef.child(pushId); // 按节点key(即用户UID)匹配查询 userNodeRef.orderByKey().equalTo(FirebaseAuth.instance.currentUser!.uid).once().then((userSnapshot) { if (userSnapshot.exists) { Map<String, dynamic> userData = userSnapshot.value as Map<String, dynamic>; // 拿到用户详情后的处理逻辑 } }); }); } });
内容的提问来源于stack exchange,提问作者wuuyungwuu
相关产品推荐
相关产品推荐

