Получение всех значений поля в ArrayList | Firebase - PullRequest
0 голосов
/ 13 мая 2018

Я использую Firebase Realtime database в своем приложении для Android. Как я могу запросить поле Ingridients в моей базе данных и получить все значения в ArrayList?

Есть структура моей базы данных:

{
  "Receptes" : [ {
    "Ingridients" : [ "Carrot", "Salt", "Apples" ],
    "Name" : "Food"
  } ]
}

enter image description here

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Хотя база данных Firebase Realtime может хранить массивы, она не поддерживает запросы к членам массива или обновление отдельных элементов массива. Поэтому, чтобы решить эту проблему, я рекомендую вам альтернативную структуру базы данных, которая выглядит следующим образом:

{
  "Receptes" : {
    "Ingridients" : {
      "Carrot" : true,
      "Salt" : true,
      "Apples" : true
    },
    "Name" : "Food"
  }
}

Как видите, теперь Receptes и Ingridients хранятся как Maps, а не как массивы. И для запроса вашей базы данных для отображения всех ингредиентов, пожалуйста, используйте следующий код:

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" : {
      "IngridientIdOne" : {
        "Carrot" : true,
        "Salt" : true,
        "Apples" : true
      },
      "IngridientIdTwo" : {
        "Strawberries" : true,
        "Sugar" : true,
        "Bananas" : true
      },
    },
    "Name" : "Food"
  }
}
0 голосов
/ 13 мая 2018
DatabaseReference recept = FirebaseDatabase.getInstance().getReference("Receptes");
DatabaseReference vegies = recept.child("Ingridients");

Обратитесь к документации для получения более подробных объяснений.

Вам также необходимо добавить слушателя

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());
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...