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

时间:2018-03-10 01:26:24

标签: android firebase firebase-realtime-database

你好,这里是我的firebase数据库:

Pic of my Firebase database

我想获得所有具有特殊症状的药物清单。

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

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) {

        }
    });
}

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

2 个答案:

答案 0 :(得分:3)

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

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

因此,这会检查/Medicine/symptoms的孩子的name属性,只有当他们的值等于Neck pain时才会返回。{/ p>

这有两个问题:

  1. 您的JSON没有/Medicine/symptoms。相反,您有一个Medicine,其中每个子节点都有一个symptoms节点。
  2. 即使这样,您的symptoms孩子的价值也不会Neck pain。相反,您有一个数组,其中每个值可能是Neck pain
  3. 您现在可以获得的最接近的查询是:

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

    此查询返回第一个症状名称等于Neck pain的药物。 Firebase无法跨所有阵列成员执行查询,以查看它是否包含任何位置的特定值。

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

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

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

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

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

答案 1 :(得分:0)

您无法使用firebase数据库作为关系数据库..而不是您要查找的内容..您可以创建这样的新节点

medicineSymp
---neckpain 
-------medicine1ID
-------medicine1ID
-------medicine1ID
通过这种方式,您可以更快,更轻松地获得所有药物