enter image description here

Я посылаю «закуски и закуски», который находится в клавише {{x0}} из одного действия 1 к деятельности 2.

В действии 2 полученные данные просто:

intent = getIntent();
String received_id = intent.getStringExtra("cat_id");
Log.e("ID received is", received_id);

Выход:

ID received is : Appetizers and Snacks

С помощью этого значения я пытаюсь прочитать узел {{x0}} и отобразить все данные в соответствующих представлениях.

Я только хочу знать, как мне добраться до узла recipes. Я пробовал это до сих пор:

  query = FirebaseDatabase.getInstance().getReference("All Categories").orderByChild("name").equalTo(received_id);

  query.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            Log.e("data", String.valueOf(dataSnapshot));
            if (dataSnapshot.exists()) {
                for (DataSnapshot dataSnapshot1 : dataSnapshot.child("recipes").getChildren()) {
                    Log.e("data final is ", String.valueOf(dataSnapshot1.getValue()));
                    DetailModel p = dataSnapshot1.getValue(DetailModel.class);
                    detailModelList.add(p);
                }

                detailAdapter = new DetailAdapter(DetailCategory.this, detailModelList);
                recyclerView.setAdapter(detailAdapter);
                progressBar.setVisibility(View.INVISIBLE);
            } else {
                Toast.makeText(DetailCategory.this, "No data available !", Toast.LENGTH_SHORT).show();
                Log.e("No data available !", "No data available !");
                progressBar.setVisibility(View.INVISIBLE);
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

            Toast.makeText(DetailCategory.this, databaseError.getDetails(), Toast.LENGTH_SHORT).show();
        }
    });
    recyclerView.setLayoutManager(new GridLayoutManager(DetailCategory.this, 2));

Log.e("data", String.valueOf(datasnapshot)) дает этот выход:

DataSnapshot { key = All Categories, value = {0={image=https://i.imgur.com/0toOJMa.jpg, recipes={randomkey={image=https://i.ibb.co/gvH8Vp2/5f6fg0l8-keraal-roast-chicken-62.png, servings=4 servings, ingredients="complete Ingredients here"}}, name=Appetizers and Snacks}} }

Мой класс DetailModel - это простой класс:

public DetailModel() {
}

String image,title, time,servings,ingredients,steps;
 public DetailModel(Integer id, String image, String title, String time, String servings, String ingredients, String steps) {
    this.id = id;
    this.image = image;
    this.title = title;
    this.time = time;
    this.servings = servings;
    this.ingredients = ingredients;
    this.steps = steps;
}

public Integer getId() {
    return id;
}

public String getImage() {
    return image;
}

public String getTitle() {
    return title;
}

public String getTime() {
    return time;
}

public String getServings() {
    return servings;
}

public String getIngredients() {
    return ingredients;
}

public String getSteps() {
    return steps;
}
   

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

Он не достигает if (dataSnapshot.exists ()) {и никакой код внутри не выполняется. Поскольку я также проверил журналы настроек, в Logcat тоже ничего не найдено. Любые советы, почему это происходит?

Редактировать: Я сделал как Фрэнк рекомендуется, все же нет данных в приложении

Пожалуйста, помогите мне прочитать эти вложенные данные.

3
Sainita 15 Янв 2021 в 20:31

2 ответа

Лучший ответ

Вместо этого:

databaseReference = FirebaseDatabase.getInstance().getReference("All Categories").child("name").orderByValue().equalTo(received_id).getRef();

Вы захотите использовать:

Query query = FirebaseDatabase.getInstance().getReference("All Categories").orderByChild("name").equalTo(received_id);

Так:

  1. Используйте orderByChild("name"), чтобы указать базе данных упорядочить все дочерние узлы по значению их свойства name.
  2. Используйте {{x0}}, чтобы затем отфильтровать отсортированные данные.
  3. Удалите getRef(), так как это фактически отменяет все построение вашего запроса.

Чтобы прочитать данные, делайте:

query.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        if (dataSnapshot.exists()) {
            for (DataSnapshot categorySnapshot: dataSnapshot.getChildren()) {
                for (DataSnapshot recipeSnapshot: categorySnapshot.child("recipes").getChildren()) {
                    DetailModel p = recipeSnapshot.getValue(DetailModel.class);
                    detailModelList.add(p);
                }
            }

            detailAdapter = new DetailAdapter(DetailCategory.this, detailModelList);
            recyclerView.setAdapter(detailAdapter);
            progressBar.setVisibility(View.INVISIBLE);
        } else {
            Toast.makeText(DetailCategory.this, "No data available !", Toast.LENGTH_SHORT).show();
            progressBar.setVisibility(View.INVISIBLE);
        }
    }

Так:

  1. Прослушайте только что созданный запрос.
  2. Затем петлю над детьми {{x0}} каждого узла, мы возвращаемся в снимок.
1
Frank van Puffelen 16 Янв 2021 в 17:43
    databaseReference = FirebaseDatabase.getInstance().getReference();
    val ref = database.child("All Categories").child("0").child("recipes")
    
   
    val valueEventListener = object : ValueEventListener {
    override fun onDataChange(dataSnapshot: DataSnapshot) {
         val recipes = dataSnapshot.getValue(Recipes::class.java) // recipes model reading
    }

    override fun onCancelled(databaseError: DatabaseError) {
        
    }
}
ref.addListenerForSingleValueEvent(valueEventListener)
0
snorlax 15 Янв 2021 в 17:56