You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取当前用户并在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:28:02