如何获取当前用户并在RecyclerView中展示其专属预订信息?
解决Firebase查询筛选当前用户预订记录无数据的问题
看起来你已经找对了方向,用orderByChild("userEmail").equalTo(userEmail)来筛选当前用户的预订记录,但RecyclerView空了,咱们一步步排查问题:
1. 先确认邮箱匹配度(最常见原因)
Firebase的查询是大小写敏感的,而且要求字符串完全匹配。你需要:
- 检查数据库
Bookings节点下每条记录的userEmail字段,是否和当前用户的邮箱(userEmail变量的值)完全一致,包括大小写、空格、特殊字符。比如数据库存的是Sarah@Example.com,但当前用户邮箱是sarah@example.com,就会匹配失败。
2. 验证userEmail是否正确获取
在onStart()方法里加个日志打印,确认拿到的邮箱是对的:
Log.d("ViewBookingDebug", "当前用户邮箱: " + userEmail);
运行后查看Logcat,确保这个值和数据库里的字段完全一致。
3. 检查数据库权限是否允许读取
如果Firebase数据库的规则限制了未授权用户的读取权限,或者规则不正确,查询会静默失败,不会返回任何数据。你可以暂时把规则改成(测试用,上线后要调整为更严格的规则):
{ "rules": { "Bookings": { ".read": "auth != null", ".write": "auth != null" } } }
如果改完后能显示数据,说明之前的权限规则有问题,后续可以改成基于用户邮箱的权限,比如:
{ "rules": { "Bookings": { "$bookingId": { ".read": "auth != null && data.child('userEmail').val() == auth.token.email", ".write": "auth != null && newData.child('userEmail').val() == auth.token.email" } } } }
4. 检查Booking实体类的字段映射
确保你的Booking类里的字段名和数据库中的键完全一致,比如数据库里是userEmail,实体类里必须有:
private String userEmail; public String getUserEmail() { return userEmail; } public void setUserEmail(String userEmail) { this.userEmail = userEmail; }
如果字段名不匹配(比如实体类里写的是email而不是userEmail),Firebase无法正确解析数据,适配器就拿不到内容。
5. 监听查询的错误和数据情况
给查询添加一个监听,直接查看是否有数据返回或者错误:
Query query = mdatabase.getReference("Bookings").orderByChild("userEmail").equalTo(userEmail); query.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { Log.d("ViewBookingDebug", "找到的预订记录数: " + dataSnapshot.getChildrenCount()); // 遍历打印每条数据,确认内容 for (DataSnapshot snap : dataSnapshot.getChildren()) { Log.d("ViewBookingDebug", "预订数据: " + snap.getValue(Booking.class).toString()); } } @Override public void onCancelled(DatabaseError databaseError) { Log.e("ViewBookingDebug", "数据库错误: " + databaseError.getMessage()); } });
通过这个日志,你能直接知道查询有没有拿到数据,或者是不是有权限错误、路径错误。
6. 确保用户已登录(避免user为null)
虽然你已经用FirebaseAuth.getInstance().getCurrentUser()获取用户,但最好加个非空判断,防止用户未登录的情况:
user = FirebaseAuth.getInstance().getCurrentUser(); if (user != null) { userEmail = user.getEmail(); // 执行查询和适配器初始化 } else { // 处理用户未登录的情况,比如跳转到登录页面 Toast.makeText(getActivity(), "请先登录", Toast.LENGTH_SHORT).show(); // 跳转到登录页的代码 }
按照上面的步骤排查,应该能找到问题所在。如果还是不行,可以把Logcat里的日志或者数据库的结构截图(去掉敏感信息)贴出来,方便进一步排查。
内容的提问来源于stack exchange,提问作者Ouila SaRaH
相关产品推荐
相关产品推荐

