снимок.getChildren() выводит значения, в то время как GetValue() возвращает значение null

# #java #android #firebase #firebase-realtime-database

Вопрос:

У меня возникли проблемы с возможностью печати значений в моментальном снимке, но конкретизация с помощью get values возвращает значение null.

Я пытаюсь получить список, загруженный в Firebase, и сравнить его со списком, который передаст пользователь.

 rootReference.addListenerForSingleValueEvent(new ValueEventListener() {  @Override  public void onDataChange(@NonNull DataSnapshot snapshot) {  for (DataSnapshot item_child : snapshot.getChildren())  {  String recId = item_child.getKey();  DatabaseReference rootReference = FirebaseDatabase.getInstance("https://what-s-cookin-a3bec-default-rtdb.asia-southeast1.firebasedatabase.app/")  .getReference().child("Recipes").child(recId);   Log.d(TAG, "RECID: "   recId);  rootReference.addListenerForSingleValueEvent(new ValueEventListener() {  @Override  public void onDataChange(@NonNull DataSnapshot snapshot) {  for (DataSnapshot ds : snapshot.getChildren())  {  Log.d(TAG, "SNAPSHOT: "   ds);  Log.d(TAG, "SPECIFIC: "   ds.child("ingredients"));  if(ds.child("ingredients").getValue() != null)  {  Log.d(TAG, "INGREDIENTS NOT NULL");  ArrayListlt;Stringgt; ing = new ArrayListlt;Stringgt;();  for (DataSnapshot ings : snapshot.child("ingredients").getChildren())  {  ing.add(ings.getValue(String.class));  Log.d(TAG, "DS: "   ds);  Log.d(TAG, "INGS: "   ings);  }  

Это результат работы logcat:

 SNAPSHOT: DataSnapshot { key = ingredients, value = {0=Fish, 1=bitter, 2=cilantro} } SPECIFIC: DataSnapshot { key = ingredients, value = null }  

Снимок экрана Logcat

Это наша база огня: Скриншот базы огня

Рецепты 1634971267099 Количество фаворитов: 8 идентификатор: «1634971267099» Изображение: «https://firebasestorage.googleapis.com/v0/b/wha…» ингредиенты 0: «Рыба» 1: «горький» 2: «Кинза» Основное блюдо: «Свинина» мера: «тест» название: «Почеро» продукт: «тест» подача: «15» время: «30» uid: «tMdUFcAelyeVo5DYW3P7HolRW4S2»

Комментарии:

1. Ваша вторая for петля закончилась snapshot.child("ingredients").getChildren() , но так и должно быть ds.child("ingredients").getChildren() . Я настоятельно рекомендую использовать значимые имена переменных, чтобы предотвратить такие ошибки.

2. Спасибо, но проблема была не в этом. Я изменил переменные на то, что вы предложили, но это все равно создает ту же проблему. Когда я использую getChildren(), он выводит все, что есть в базе данных, но когда я называю ее конкретно дочерней. («ингредиенты»).GetValue(), возвращает значение null

3. Это определенно была одна из проблем в вашем коде. Вы сначала проверяете if(ds.child("ingredients").getValue() , а затем выполняете цикл for (DataSnapshot ings : snapshot.child("ingredients").getChildren()) , поэтому в одном из них вы используете ingredients дочерний элемент неправильного снимка. Если вы исправили это и все еще сталкиваетесь с той же проблемой, отредактируйте свой вопрос, чтобы показать обновленный код.

Ответ №1:

Проверьте, соответствует ли ваш код данным Firebase. Было бы более понятно, если бы вы опубликовали скриншот данных Firebase, чтобы понять иерархию базы данных.

Трудно понять структуру базы данных из вашего кода.

Комментарии:

1. Я отредактировал вопрос и добавил иерархию firebase. Извини за это