Получение значения с нулем при попытке объединить orderByChild () и startAt ()

1

Получение значения как нулевого при попытке кода ниже для сортировки и фильтрации данных с использованием orderByChild() и startAt()

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

Изображение 174551 Изображение 174551

Код как следует

Query queryMeal = FirebaseDatabase.getInstance().getReference("meals");
            queryMeal.orderByChild("meal_name").startAt("ggh").addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    Log.e("Query DataSnapShot",""+dataSnapshot.toString());
                }

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

                }
            });
Теги:
firebase
firebase-realtime-database

2 ответа

1
Лучший ответ

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

Query queryMeal = FirebaseDatabase.getInstance().getReference("meals");
ueryMeal.orderByChild("meal_name").startAt("ggh").addListenerForSingleValueEvent();

в

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
Query queryMeal = FirebaseDatabase.getInstance().getReference().child("meals").child(uid);
ueryMeal.orderByChild("meal_name").startAt("ggh").endAt("ggh" + "\uf8ff").addListenerForSingleValueEvent();

Редактировать:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference mealsRef = rootRef.child("meals");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot uidSnapshot : dataSnapshot.getChildren()) {
            String uid = uidSnapshot.getKey();

            DatabaseReference uidRef = rootRef.child("meals").child(uid).startAt("ggh").endAt("ggh" + "\uf8ff");
            ValueEventListener eventListener = new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for(DataSnapshot ds : dataSnapshot.getChildren()) {
                        String mealName = ds.child("meal_name").getValue(String.class);
                        Log.d(TAG, mealName);
                    }
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {
                    Log.d(TAG, databaseError.getMessage());
                }
            };
            uidRef.addListenerForSingleValueEvent(eventListener);
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage());
    }
};
mealsRef.addListenerForSingleValueEvent(valueEventListener);
  • 0
    Босс это выглядит хорошо, но я хочу искать во всем узле "еды".
  • 0
    В этом случае вам следует запросить базу данных дважды, как в моем обновленном ответе, верно?
Показать ещё 4 комментария
0

В вашем методе onDataChange сделайте что-то вроде этого

if(dataSnapshot != null){
   Log.e("Query DataSnapShot",""+dataSnapshot.getValue().toString());
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню