Java 获取ArrayList | Firebase中字段的所有含义
我在Android应用程序中使用的是Java 获取ArrayList | Firebase中字段的所有含义,java,android,arrays,firebase,firebase-realtime-database,Java,Android,Arrays,Firebase,Firebase Realtime Database,我在Android应用程序中使用的是Firebase实时数据库。如何在数据库中查询字段InGridents,并在ArrayList中获取所有含义 我的数据库结构如下: { "Receptes" : [ { "Ingridients" : [ "Carrot", "Salt", "Apples" ], "Name" : "Food" } ] } 有关更多说明,请查看 您还需要添加一个侦听器 recept.addValueEventListener(new ValueEv
Firebase实时数据库
。如何在数据库中查询字段InGridents
,并在ArrayList
中获取所有含义
我的数据库结构如下:
{
"Receptes" : [ {
"Ingridients" : [ "Carrot", "Salt", "Apples" ],
"Name" : "Food"
} ]
}
有关更多说明,请查看
您还需要添加一个侦听器
recept.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Log.i(TAG, dataSnapshot.child("Ingredients").getValue(String.class);
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.w(TAG, "onCancelled", databaseError.toException());
}
});
尽管Firebase实时数据库可以存储数组,但它不支持查询数组成员或更新单个数组元素。因此,为了解决这个问题,我建议您选择一种如下所示的替代数据库结构:
{
"Receptes" : {
"Ingridients" : {
"Carrot" : true,
"Salt" : true,
"Apples" : true
},
"Name" : "Food"
}
}
{
"Receptes" : {
"Ingridients" : {
"IngridientIdOne" : {
"Carrot" : true,
"Salt" : true,
"Apples" : true
},
"IngridientIdTwo" : {
"Strawberries" : true,
"Sugar" : true,
"Bananas" : true
},
},
"Name" : "Food"
}
}
如您所见,现在Receptes
和ingrides
存储为Maps
而不是数组。要查询您的数据库以显示所有InGrident,请使用以下代码:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference ingridientsRef = rootRef.child("Receptes").child("Ingridients");
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
String ingridient = ds.getKey();
Log.d("TAG", ingridient);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
ingridientsRef.addListenerForSingleValueEvent(valueEventListener);
根据您的评论,数据库应如下所示:
{
"Receptes" : {
"Ingridients" : {
"Carrot" : true,
"Salt" : true,
"Apples" : true
},
"Name" : "Food"
}
}
{
"Receptes" : {
"Ingridients" : {
"IngridientIdOne" : {
"Carrot" : true,
"Salt" : true,
"Apples" : true
},
"IngridientIdTwo" : {
"Strawberries" : true,
"Sugar" : true,
"Bananas" : true
},
},
"Name" : "Food"
}
}
你是什么意思?我的意思是我需要得到胡萝卜,
Salt
和Apples
进入我的ArrayList
你能编辑这个问题,以显示你尝试过的代码,但它没有按你期望的方式工作吗?乍一看,你似乎试图使用数组来存储一组数据。请参阅,以了解为什么不可能使用此结构根据配方的成分查询配方,以及如何改为构建数据库以允许查询。可能重复,但对于大量配方,数据库的结构会是什么样子?如何获取每个唯一接收器的名称
?您可以通过在InGridents
节点下添加成分id来实现,就像我更新的答案一样。看到了吗,IngridientDone,IngridientTwo?好的。如何在此ValueEventListener
中获取值ingridientDone
和ingridientTwo
?正如您在我的代码中看到的,要查询数据库,不需要这些ID。但是,如果您想拥有它们,那么在添加InGrident时只需将这些ID存储在一个变量中,对吗?为什么我使用您的代码行String InGrident=ds.getKey()
不是返回Inridients,而是返回InridientDone
?对于我的数据库结构,您的代码将返回null