如何实现Firebase Realtime Database按任意字段及组合字段检索
Firebase Realtime Database 多字段检索方案
1. 任意单字段独立检索
Firebase原生支持对任意字段执行orderByChild查询,你只需要把检索字段作为参数传入原有方法即可,需要提前给对应字段配置索引避免大数据量下查询报错、性能下降。
修改后的单字段检索代码示例:
// 调用时传入对应字段名即可,比如检索SP_CarNumber就传"SP_CarNumber" private void txtSearch(String searchStr, String field){ FirebaseRecyclerOptions<MainModel> options = new FirebaseRecyclerOptions.Builder<MainModel>() .setQuery(FirebaseDatabase.getInstance().getReference().child("Declaration_Data").child(currentuser).child("Declarations").orderByChild(field).startAt(searchStr).endAt(searchStr + "\uf8ff"), MainModel.class) .build(); mainAdapter = new MainAdapter(options); mainAdapter.startListening(); recyclerView.setAdapter(mainAdapter); }
2. 多字段组合检索
Firebase Realtime Database原生不支持连续调用多次orderByChild做联合查询,需要提前新增冗余组合字段实现:
- 存储数据时新增组合字段,比如命名为
SP_FP_CarCombine,字段值固定为SP_CarNumber的值 + "_" + FP_CarNumber的值 - 查询时对该组合字段执行
orderByChild,传入拼接好的组合搜索值即可实现双字段匹配
组合检索代码示例:
private void combinedSearch(String spCarStr, String fpCarStr){ // 拼接规则要和存数据时的规则完全一致 String combineStr = spCarStr + "_" + fpCarStr; FirebaseRecyclerOptions<MainModel> options = new FirebaseRecyclerOptions.Builder<MainModel>() .setQuery(FirebaseDatabase.getInstance().getReference().child("Declaration_Data").child(currentuser).child("Declarations").orderByChild("SP_FP_CarCombine").startAt(combineStr).endAt(combineStr + "\uf8ff"), MainModel.class) .build(); mainAdapter = new MainAdapter(options); mainAdapter.startListening(); recyclerView.setAdapter(mainAdapter); }
索引配置
所有用于检索的字段都需要在Firebase控制台的 Realtime Database 规则页配置索引,示例配置如下:
{ "rules": { "Declaration_Data": { "$userId": { "Declarations": { ".indexOn": ["FP_CarNumber", "SP_CarNumber", "SP_FP_CarCombine"] } } } } }
注意事项
- 组合字段的拼接分隔符要选择不会出现在字段值中的符号,避免出现误匹配
- 如有多种组合检索场景,可以根据需求预制多个不同的组合冗余字段
内容的提问来源于stack exchange,提问作者Benas Rudnickas
相关产品推荐
相关产品推荐

