如何获取Firebase实时数据库中属性值属于预定义列表的记录
问题根因
你当前写法的逻辑是按username排序后,返回字典序介于myList首项和尾项之间的所有用户节点,并非精准匹配列表内的用户名。只要用户名的字典序落在你传入的两个边界值范围内,哪怕不在目标列表中也会被返回,自然无法得到准确结果。
Firebase Realtime Database 原生没有提供SQL中WHERE IN (...)类型的多值精准匹配查询能力,无法直接在数据库查询层一次性过滤出无序列表内的匹配项,可通过以下两种成熟方案实现需求。
实现方案
方案1:逐值等值查询+本地结果合并(适合目标列表长度<10的场景)
遍历存储目标用户名的myList,对每个用户名单独构造equalTo()等值查询,待所有查询返回后汇总匹配结果,再绑定到列表渲染。该方案的请求次数和目标列表长度一致,列表过长时会产生较多请求开销,不建议在列表长度较大时使用。
核心代码参考:
DatabaseReference usersRef = FirebaseDatabase.getInstance().getReference().child("users"); List<MainModel> matchedResult = new ArrayList<>(); final int[] finishCount = {0}; for (String targetName : myList) { usersRef.orderByChild("username") .equalTo(targetName) .addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { for (DataSnapshot userSnap : snapshot.getChildren()) { matchedResult.add(userSnap.getValue(MainModel.class)); } finishCount[0]++; // 所有查询完成后渲染列表 if (finishCount[0] == myList.size()) { // 此处直接用普通RecyclerView.Adapter绑定matchedResult即可,无需再依赖FirebaseRecyclerOptions的远程查询绑定 } } @Override public void onCancelled(@NonNull DatabaseError error) { finishCount[0]++; } }); }
方案2:拉取全量用户节点+本地过滤(适合users节点总数据量<1000的场景)
如果users节点下的总用户规模不大,可以直接一次性拉取整个节点的所有数据,在本地判断用户名是否存在于目标列表中,过滤出符合要求的结果后再渲染。该方案仅需发送1次请求,实现逻辑最简单。
核心代码参考:
DatabaseReference usersRef = FirebaseDatabase.getInstance().getReference().child("users"); usersRef.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { List<MainModel> matchedResult = new ArrayList<>(); for (DataSnapshot userSnap : snapshot.getChildren()) { MainModel user = userSnap.getValue(MainModel.class); if (myList.contains(user.getUsername())) { matchedResult.add(user); } } // 拿到matchedResult后绑定适配器渲染即可 } @Override public void onCancelled(@NonNull DatabaseError error) { // 处理请求错误逻辑 } });
大数据量场景优化建议
如果目标列表长度、users节点总数据量都超过千级,上述两种方案的性能都无法满足要求,建议调整数据结构:提前为需要批量查询的用户增加分组标记字段,或者单独构建分组索引节点,查询时直接按分组标记过滤,可大幅降低请求开销和本地计算量。
内容的提问来源于stack exchange,提问作者Sadam Hussain
相关产品推荐
相关产品推荐

