如何在Firebase实时数据库中添加多条件Where查询
实现双条件查询的解决方案
要获取同时满足deleteStatus=no且userID=指定用户ID的数据列表,Firebase Realtime Database需要通过复合查询来实现,以下是具体方案:
方案一:数据库端过滤(推荐)
这种方式直接在数据库层面完成双条件筛选,性能和流量更优,需要两步操作:
1. 添加复合索引
登录Firebase控制台,在数据库规则中添加针对复合字段的索引:
{ "rules": { "medicines": { ".indexOn": ["userId", "userId_deleteStatus"] } } }
2. 新增复合字段并修改查询代码
在每条medicines数据中新增userId_deleteStatus字段,值格式为[用户ID]_no(比如用户ID是u12345,则字段值为u12345_no)。之后修改查询代码:
FirebaseRecyclerOptions<ModelMed> options = new FirebaseRecyclerOptions.Builder<ModelMed>() .setQuery(FirebaseDatabase.getInstance().getReference() .child("medicines") .orderByChild("userId_deleteStatus") .equalTo(mysharedPreferance.getUserID() + "_no"), ModelMed.class) .build();
方案二:客户端过滤(临时替代)
如果暂时无法修改数据结构,也可以先按userId拉取数据,再在客户端筛选deleteStatus:
FirebaseRecyclerOptions<ModelMed> options = new FirebaseRecyclerOptions.Builder<ModelMed>() .setQuery(FirebaseDatabase.getInstance().getReference() .child("medicines") .orderByChild("userId") .equalTo(mysharedPreferance.getUserID()), ModelMed.class) .build();
在适配器的绑定方法中过滤数据:
@Override protected void onBindViewHolder(@NonNull ViewHolder holder, int position, @NonNull ModelMed model) { if ("no".equals(model.getDeleteStatus())) { // 渲染符合条件的条目 holder.bindData(model); } else { // 隐藏不符合条件的条目 holder.itemView.setVisibility(View.GONE); holder.itemView.setLayoutParams(new RecyclerView.LayoutParams(0, 0)); } }
注意:该方案会下载当前用户的所有medicines数据,数据量大时会消耗更多流量和性能,仅建议作为临时方案使用。
内容的提问来源于stack exchange,提问作者Tanveer Hasan
相关产品推荐
相关产品推荐

