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
相关产品推荐
相关产品推荐

