Data tidak diambil dari database Firebase

Sep 14 2020

Saya memiliki database Firebase seperti yang ditunjukkan pada gambar. Saya mencoba mengambil data berdasarkan beberapa kondisi tetapi tidak menunjukkan hasil.

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

        }
    });

Tidak ada pertunjukan di toast itu. Saya juga mencoba equalTo daripada startAt. tapi tidak ada hasil.

Jawaban

1 AlexMamo Sep 14 2020 at 16:08

Ada empat masalah dalam kode Anda. Yang pertama adalah kueri yang Anda gunakan. Jika Anda ingin mendapatkan hasil berdasarkan suatu kondisi, harap ubah kueri berikut:

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

Untuk:

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

Tidak perlu .child("45961")menelepon, karena Anda perlu mengulang hasil.

Masalah kedua adalah Anda mendapatkan DataSnapshotobjek sebagai argumen tetapi Anda tidak mengulang untuk mendapatkan hasilnya. Untuk benar-benar mendapatkan hasil, Anda harus menggunakan kode berikut:

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

Masalah ketiga adalah kenyataan bahwa Anda tidak memeriksa potensi kesalahan. Anda juga dapat mempertimbangkan untuk menggunakan:

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

Masalah keempat terletak pada kenyataan bahwa Anda menggunakan nama yang dimulai dengan huruf besar. Untuk itu, saya sarankan Anda melihat jawaban saya dari postingan berikut ini:

Firebase Android ListView tidak ditampilkan

Atau:

cara membaca sub-koleksi firestore dan meneruskannya ke FirestoreRecyclerOptions

Jika kolom di kelas Anda adalah huruf kecil.

PeterHaddad Sep 14 2020 at 16:01

Ubah ini:

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

ke dalam ini:

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

Jika Anda ingin menggunakan FromIdbagian dalam orderByChild()maka Anda tidak perlu mengaksesnyachild("45961")