enter image description here

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

    DbRef2 =FirebaseDatabase.getInstance().getReference().child("Notification");

    DbRef2.child("45961").orderByChild("FromId").startAt("22222").addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()){
                Toast.makeText(getApplicationContext(),"hello",Toast.LENGTH_SHORT).show();
                Notification notf = dataSnapshot.getValue(Notification.class);
                Toast.makeText(getApplicationContext(),"hai"+notf.getFromId(),Toast.LENGTH_SHORT).show();
            }
        }

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

        }
    });

В тосте ничего не видно. Я также пробовал equalTo вместо startAt. но без результатов.

1
Vishal 14 Сен 2020 в 11:42

2 ответа

Лучший ответ

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

DbRef2.child("45961").orderByChild("FromId").startAt("22222").addListenerForSingleValueEvent(/* ... */);

Кому:

DbRef2.orderByChild("FromId").startAt("22222").addListenerForSingleValueEvent(/* ... */);

В вызове .child("45961") нет необходимости, так как вам нужно просмотреть результаты в цикле.

Вторая проблема заключается в том, что вы получаете объект DataSnapshot в качестве аргумента, но не выполняете цикл для получения результатов. Чтобы действительно получить результаты, вы должны использовать следующий код:

@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
    if (dataSnapshot.exists()){
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            Toast.makeText(getApplicationContext(),"hello",Toast.LENGTH_SHORT).show();
            Notification notf = ds.getValue(Notification.class);
            Toast.makeText(getApplicationContext(),"hai"+notf.getFromId(),Toast.LENGTH_SHORT).show();
        }
    }
}

Третья проблема заключается в том, что вы не проверяете возможные ошибки. Вы также можете использовать:

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

Четвертая проблема заключается в том, что вы используете имена, начинающиеся с верхнего регистра. Для этого я рекомендую вам увидеть мой ответ из следующего сообщения:

FireBase Android ListView не отображается

Или же:

как прочитать вложенную коллекцию firestore и передать ее FirestoreRecyclerOptions

Если поля в вашем классе строчные.

1
Alex Mamo 14 Сен 2020 в 09:08

Изменить это:

 DbRef2.child("45961").orderByChild("FromId").startAt("22222").addListenerForSingleValueEvent(new ValueEventListener() {

В это:

DbRef2.orderByChild("FromId").startAt("22222").addListenerForSingleValueEvent(new ValueEventListener() {

Если вы хотите использовать FromId внутри orderByChild(), вам не нужен доступ к child("45961")

0
Peter Haddad 14 Сен 2020 в 09:01