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

使用android搜索firebase数据库中的子节点,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,大家好,这是我的firebase数据库: 我想得到所有有特殊症状的药物的清单 这是我的代码,即我所做的 public void initializeMedicineListener(String node,String type,String value){ mDatabase=mFirebaseInstance.getReference(); Query query = mDatabase.child("Medicine").child("symptoms").orderBy

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

我想得到所有有特殊症状的药物的清单

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

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

        }
    });
}
public void initializeMedicinListener(字符串节点、字符串类型、字符串值){
mDatabase=mFirebaseInstance.getReference();
Query Query=mDatabase.child(“药物”).child(“症状”).orderByChild(“名称”).equalTo(“颈部疼痛”);
query.addListenerForSingleValueEvent(新的ValueEventListener()){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
medicineList=新的ArrayList();
if(dataSnapshot.exists()){
for(DataSnapshot医学:DataSnapshot.getChildren()){
医学数据=Medicine.getValue(Medicine.class);
药物清单。添加(数据);
}
}
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
}
但我得到的结果是空的。
伙计们,请告诉我。我做错了什么吗???

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

mDatabase.child("Medicine").child("symptoms").orderByChild("name").equalTo("Neck pain");
因此,这将检查
/Medicine/symptoms
的子对象的
名称
属性,并且仅当其值等于
颈部疼痛
时才返回它们

这有两个问题:

  • 您的JSON没有
    /Medicine/symptoms
    。相反,您有一个
    医学
    ,其中每个子节点都有一个
    症状
    节点
  • 即使有,您的
    症状
    孩子也没有颈部疼痛值。取而代之的是一个数组,其中每个值可能是
    颈部疼痛
  • 现在最接近所需查询的是:

    mDatabase.child("Medicine").orderByChild("symptoms/0/name").equalTo("Neck pain");
    
    此查询返回第一症状名称等于颈部疼痛的药物。Firebase无法跨所有数组成员执行查询,以查看它是否在任何位置包含特定值

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

    您当前的数据结构允许您高效地查找给定药物的症状(和其他数据)。太好了。但是,它不允许您有效地查找给定症状的药物。例如,为了实现这一点,您可以添加一个将每个特定症状映射回其药物的结构:

    symptoms
      "Neck pain"
        -L6hb2...bRb0: true
        -L6rW...Fuxkf: true
    
    使用此附加结构(称为反向索引或反向索引),您现在可以通过简单加载
    /症状/颈部疼痛
    来查找治疗颈部疼痛的药物


    有关这种分类方法的更多信息,请参见我的回答:

    您不能将firebase数据库作为关系数据库使用。。而不是你想要的。。您可以像这样创建新节点

    medicineSymp
    ---neckpain 
    -------medicine1ID
    -------medicine1ID
    -------medicine1ID
    

    这样你就可以更快更容易地得到所有的药物了

    嗨,你能把你的药物贴出来吗?有时是因为你的POJO中的变量与Firebase中的变量不匹配。非常感谢你,弗兰克。我得到了Hanks Mohammad的回答