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

如何获取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 21:02:01