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

Firebase查询问题:购物车商品无法列表显示技术求助

问题诊断与修复方案

嘿,我帮你找出问题所在了!你的代码里有两个关键错误导致订单/购物车列表加载不出来,咱们一步步来修复:

1. Firebase查询语句完全写错了

你当前的查询代码逻辑混乱,startAt(email.toString()).equalTo(true,email)这种写法完全不符合Firebase的查询API规范。你想要的是筛选出当前用户email对应的订单,所以正确的查询应该直接用equalTo(email)来匹配email字段,多余的startAt和错误的参数会导致查询返回空结果。

2. 字符串比较用了==,这在Java里是坑

在convertCarttoStatus方法里,你用status == "0"来比较字符串,但Java中==比较的是对象的内存引用,不是字符串内容,应该用equals()方法来做内容比较,否则状态转换也会出问题。


修正后的完整代码

下面是修复后的OrderStatus.java代码,我还加了一些额外的安全判断和生命周期处理:

public class OrderStatus extends AppCompatActivity {
    RecyclerView recyclerView;
    RecyclerView.LayoutManager layoutManager;
    FirebaseDatabase database;
    DatabaseReference requests;
    FirebaseRecyclerAdapter<Request, OrderViewHolder> adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_order_status);

        // 初始化Firebase
        database = FirebaseDatabase.getInstance();
        requests = database.getReference("Request");

        // 初始化RecyclerView
        recyclerView = findViewById(R.id.listOrders);
        recyclerView.setHasFixedSize(true);
        layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);

        // 获取当前用户,增加空判断避免崩溃
        FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
        if (user != null) {
            loadOrders(user.getEmail());
        }
    }

    private void loadOrders(String email) {
        // 修正后的查询:精准匹配当前用户的email
        Query query = FirebaseDatabase.getInstance()
                .getReference("Request")
                .orderByChild("email")
                .equalTo(email)
                .limitToLast(50);

        FirebaseRecyclerOptions<Request> options = new FirebaseRecyclerOptions.Builder<Request>()
                .setQuery(query, Request.class)
                .build();

        adapter = new FirebaseRecyclerAdapter<Request, OrderViewHolder>(options) {
            @NonNull
            @Override
            public OrderViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.order_layout, parent, false);
                return new OrderViewHolder(view);
            }

            @Override
            protected void onBindViewHolder(@NonNull OrderViewHolder viewHolder, int position, @NonNull Request model) {
                viewHolder.txtOrderID.setText(adapter.getRef(position).getKey());
                viewHolder.txtOrderStatus.setText(convertCarttoStatus(model.getStatus()));
                viewHolder.txtOrderAddress.setText(model.getAddress());
                viewHolder.txtOrderPhone.setText(model.getPhone());
            }
        };
        recyclerView.setAdapter(adapter);
    }

    private String convertCarttoStatus(String status) {
        // 用equals比较字符串内容,避免引用比较的坑
        if ("0".equals(status)) return "Placed";
        else if ("1".equals(status)) return "On My Way";
        else return "Shipped";
    }

    // 必须处理FirebaseRecyclerAdapter的生命周期,否则数据不会实时更新
    @Override
    protected void onStart() {
        super.onStart();
        if (adapter != null) {
            adapter.startListening();
        }
    }

    @Override
    protected void onStop() {
        super.onStop();
        if (adapter != null) {
            adapter.stopListening();
        }
    }
}

额外要检查的几个点

  • 确认Firebase数据库里Request节点下的每个订单对象,email字段和当前用户的邮箱完全一致(大小写敏感,比如test@example.com和Test@example.com会被当成不同值)。
  • 检查Firebase数据库规则,确保用户有权限读取自己的订单,推荐设置如下规则(只允许登录用户读取自己的订单):
{
  "rules": {
    "Request": {
      ".read": "auth != null && query.orderByChild == 'email' && query.equalTo == auth.token.email",
      ".write": "auth != null"
    }
  }
}
  • 如果你之前的代码没加onStart和onStop里的监听启动/停止,一定要加上,否则FirebaseRecyclerAdapter不会开始监听数据变化。

内容的提问来源于stack exchange,提问作者JDevoloper

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:11:38