Не могу получить детей в моей базе данных Firebase - PullRequest
0 голосов
/ 10 апреля 2020

firebase database

Я пытаюсь получить эти значения в узле panadol и profinal. но это не работает Я смог получить дату успешно. Вот мой код

for(final String id: MedicinesListActivity.orderIdsList){

        //get the date of the order
        DatabaseReference dateReference = FirebaseDatabase.getInstance()
                .getReference("Orders").child(id);
        dateReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                //date
                String date = dataSnapshot.child("date").getValue(String.class);
                Log.i("Date", date);

                //loop through all the products in the specific order id
                for(DataSnapshot s : dataSnapshot.child(MedicinesListActivity.userId).child("panadol").getChildren()){
                    Order order = s.getValue(Order.class);
                    Log.i("Item_Name", ""+ order.getName());
                }

            }
        });
    }

MedicineListActivity.orderIds -> содержит все идентификаторы orderIds, через которые я хочу l oop, а класс Order содержит имя и orderQuantity. Но это не работает.

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

Кажется, что под каждым узлом пользователя у вас есть список названных продуктов (panadol, profinal). Ваш код ищет один именованный продукт panadol в этом списке с помощью dataSnapshot.child(MedicinesListActivity.userId).child("panadol"):

//loop through all the products in the specific order id
for(DataSnapshot s : dataSnapshot.child(MedicinesListActivity.userId).child("panadol").getChildren()){
    Order order = s.getValue(Order.class);
    Log.i("Item_Name", ""+ order.getName());
}

Поскольку вы затем выполняете итерации по дочерним узлам panadol, ваш снимок s ссылается на отдельные свойства panadol: name и orderQuantity. Но ваш код пытается сопоставить каждое из этих свойств с целым Order объектом, который не будет работать.

У вас есть два варианта:

  • Показать отдельные свойства, без использования класса Order:

    for(DataSnapshot propSnapshot: dataSnapshot.child(MedicinesListActivity.userId).child("panadol").getChildren()){
        Log.i("Item_Name", propSnapshot.getKey() + "="+ propSnapshot.getValue());
    }
    
  • Не используйте l oop, а получите продукты и их свойства в объекте Order :

    for(DataSnapshot propSnapshot: dataSnapshot.child(MedicinesListActivity.userId).getChildren()){
        Order order = s.getValue(Order.class);
        Log.i("Item_Name", propSnapshot.getKey() + "="+ propSnapshot.getValue());
    }
    
1 голос
/ 10 апреля 2020

Чтобы решить эту проблему, используйте следующие строки кода:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = rootRef.child("Orders").child(id).child(uid);
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String name = ds.child("name").getValue(String.class);
            String orderQuantity = ds.child("orderQuantity").getValue(String.class);
            Log.d("TAG", name + "/" + orderQuantity);
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d("TAG", databaseError.getMessage()); //Don't ignore errors!
    }
};
uidRef.addListenerForSingleValueEvent(valueEventListener);

Вывод в logcat будет:

panadol/3.0
profinal/2.0

Или с использованием класса Order:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = rootRef.child("Orders").child(id).child(uid);
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            Order order = ds.getValue(Order.class);
            Log.d("TAG", ds.getName() + "/" + ds.getOrderQuantity);
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d("TAG", databaseError.getMessage()); //Don't ignore errors!
    }
};
uidRef.addListenerForSingleValueEvent(valueEventListener);

Результат будет одинаковым.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...