你好,这里是我的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) {
}
});
}
但我得到的结果是空的。 请指导我们。我做错了什么?
答案 0 :(得分:3)
当您在某个位置运行查询时,Firebase会检查该位置的每个子节点,查看您订购的属性以及您筛选的范围/条件。
mDatabase.child("Medicine").child("symptoms").orderByChild("name").equalTo("Neck pain");
因此,这会检查/Medicine/symptoms
的孩子的name
属性,只有当他们的值等于Neck pain
时才会返回。{/ p>
这有两个问题:
/Medicine/symptoms
。相反,您有一个Medicine
,其中每个子节点都有一个symptoms
节点。symptoms
孩子的价值也不会Neck pain
。相反,您有一个数组,其中每个值可能是Neck pain
。您现在可以获得的最接近的查询是:
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
通过这种方式,您可以更快,更轻松地获得所有药物