大家好,这是我的 Firebase 数据库:
我想获取具有特定症状的所有药物的 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
时才返回它们>.
这有两个问题:
- 您的 JSON 没有
/Medicine/symptoms
。相反,您有一个Medicine
,其中每个子节点都有一个symptoms
节点。 - 即使有,您的 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/