android - 使用 android 在 firebase 数据库中搜索子节点

标签 android firebase firebase-realtime-database

大家好,这是我的 Firebase 数据库:

Pic of my Firebase database

我想获取具有特定症状的所有药物的 list 。

这是我的代码,即我所做的

public void initializeMedicineListener(String node,String type,String value){
    mDatabase=mFirebaseInstance.getReference();
    Query query = mDatabase.child("Medicine").child("symptoms").orderByChild("name").equalTo("Neck pain");
    query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            medicineList=new ArrayList<Medicine>();
            if (dataSnapshot.exists()) {
                for (DataSnapshot medicine : dataSnapshot.getChildren()) {
                    Medicine data = medicine.getValue(Medicine.class);
                    medicineList .add(data);
                }
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

但我得到的结果为空。 请指导我。我做错了什么吗?

最佳答案

当您在某个位置运行查询时,Firebase 会检查该位置的每个子节点,查找您订购的属性以及您过滤的范围/条件。

mDatabase.child("Medicine").child("symptoms").orderByChild("name").equalTo("Neck pain");

因此,这会检查 /Medicine/symptoms 的子级的 name 属性,并且仅当它们的值等于 Neck pain 时才返回它们>.

这有两个问题:

  1. 您的 JSON 没有 /Medicine/symptoms。相反,您有一个 Medicine,其中每个子节点都有一个 symptoms 节点。
  2. 即使有,您的 child 的症状也没有值颈部疼痛。相反,您有一个数组,其中每个值可能是颈部疼痛

您现在可以得到的最接近您想要的查询是:

mDatabase.child("Medicine").orderByChild("symptoms/0/name").equalTo("Neck pain");

此查询返回第一个症状名称等于颈部疼痛的药物。 Firebase 无法对所有数组成员执行查询以查看它是否在任何位置包含特定值。

与 NoSQL 数据库一样:如果您无法使用当前的数据结构执行所需的用例,通常可以更改/扩展数据结构以允许该用例。通常,这是通过非常直接地将您想要在屏幕上显示的内容映射到数据库中的结构来完成的。

您当前的数据结构允许您有效地查找给定药物的症状(和其他数据)。那太棒了。然而,它不允许您有效地查找针对特定症状的药物。例如,您可以添加一个将每个特定症状映射回其药物的结构:

symptoms
  "Neck pain"
    -L6hb2...bRb0: true
    -L6rW...Fuxkf: true

通过这个附加结构(称为倒排索引或反向索引),您现在可以通过简单加载 /symptoms/Neck pain 来查找治疗Neck pain 的药物。

有关这种分类方法的更多信息,请参阅我的回答:Firebase query if child of child contains a value

关于android - 使用 android 在 firebase 数据库中搜索子节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49204429/

相关文章:

java - 如何使用给定的 ssid 和密码测试 wifi 连接并返回给定的 ssid 和密码是否正确的结果

android - 如何在android studio中添加新的导入

android - SoapFault - system.UnauthorizedAccessException : Access to the path 'C:\inetpub\wwwroot\ErrorLogs\ErrorLog20141017.txt' is denied

android - 将 branch.io sdk 与 android 应用程序集成,获取 classcastexception

javascript - 如何获取使用 Firebase Google 登录的登录用户的属性?

firebase - 如何检查用户是否拥有 Firebase Bolt 编译器中的对象

ios - 从firebase存储中快速上传人物图像

Firebase - 在 Dynadot 中添加 TXT 记录以连接自定义域

firebase - 有没有一种方法可以从Firebase在flutter应用程序中缓存音频文件

ios - 使用 Firebase 过滤搜索?