Dati non recuperati dal database Firebase

Sep 14 2020

Ho un database Firebase come mostrato nella foto. Sto cercando di recuperare i dati in base a qualche condizione ma non mostra risultati.

    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) {

        }
    });

Non c'è niente da vedere nel brindisi. Ho anche provato equalTo invece di startAt. ma nessun risultato.

Risposte

1 AlexMamo Sep 14 2020 at 16:08

Ci sono quattro problemi nel codice. Il primo sarebbe la query che stai utilizzando. Se desideri ottenere i risultati in base a una condizione, modifica la seguente query:

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

Per:

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

Non è necessaria una .child("45961")chiamata, poiché è necessario scorrere i risultati.

Il secondo problema è che ottieni l' DataSnapshotoggetto come argomento ma non esegui il ciclo per ottenere i risultati. Per ottenere effettivamente i risultati è necessario utilizzare il codice seguente:

@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();
        }
    }
}

Il terzo problema è il fatto che non stai verificando potenziali errori. Potresti anche considerare di utilizzare:

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

Il quarto problema sta nel fatto che stai usando nomi che iniziano con un maiuscolo. Per questo, ti consiglio di vedere la mia risposta dal seguente post:

Firebase Android ListView non viene visualizzato

O:

come leggere la sotto-raccolta firestore e passarla a FirestoreRecyclerOptions

Se i campi della tua classe sono in minuscolo.

PeterHaddad Sep 14 2020 at 16:01

Cambia questo:

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

in questo:

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

Se si desidera utilizzare FromIdall'interno orderByChild(), non è necessario accederechild("45961")