Java 获取ArrayList | Firebase中字段的所有含义

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

我在Android应用程序中使用的是
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