Dati non recuperati dal database Firebase
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
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.
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")