it-swarm.com.de

Firebase Firestore erhält Daten aus der Sammlung

Ich möchte Daten aus meiner Firebase Firestore-Datenbank abrufen. Ich habe eine Sammlung namens user und jeder Benutzer verfügt über eine Sammlung einiger Objekte desselben Typs (benutzerdefiniertes Java-Objekt). Ich möchte meine ArrayList mit diesen Objekten füllen, wenn meine Aktivität erstellt wird. 

private static ArrayList<Type> mArrayList = new ArrayList<>();;

In onCreate ():

getListItems();
Log.d(TAG, "onCreate: LIST IN ONCREATE = " + mArrayList);
*// it logs empty list here

Methode aufgerufen, um Elemente zur Liste zu bekommen:

private void getListItems() {
    mFirebaseFirestore.collection("some collection").get()
            .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
                @Override
                public void onSuccess(QuerySnapshot documentSnapshots) {
                    if (documentSnapshots.isEmpty()) {
                        Log.d(TAG, "onSuccess: LIST EMPTY");
                        return;
                    } else {
                        for (DocumentSnapshot documentSnapshot : documentSnapshots) {
                            if (documentSnapshot.exists()) {
                                Log.d(TAG, "onSuccess: DOCUMENT" + documentSnapshot.getId() + " ; " + documentSnapshot.getData());
                                DocumentReference documentReference1 = FirebaseFirestore.getInstance().document("some path");
                                documentReference1.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
                                    @Override
                                    public void onSuccess(DocumentSnapshot documentSnapshot) {
                                        Type type= documentSnapshot.toObject(Type.class);
                                        Log.d(TAG, "onSuccess: " + type.toString());
                                        mArrayList.add(type);
                                        Log.d(TAG, "onSuccess: " + mArrayList);
                                        /* these logs here display correct data but when
                                         I log it in onCreate() method it's empty*/
                                    }
                                });
                            }
                        }
                    }
                }
            }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            Toast.makeText(getApplicationContext(), "Error getting data!!!", Toast.LENGTH_LONG).show();
        }
    });
}
4
Slaven Petkovic

Die get()-Operation gibt einen Task<> zurück, was bedeutet, dass es sich um eine asynchrone Operation handelt. Wenn Sie getListItems() aufrufen, wird der Vorgang nur gestartet. Er wartet nicht, bis er abgeschlossen ist. Deshalb müssen Sie Listener für Erfolg und Fehler hinzufügen.

Obwohl Sie nicht viel über die asynchrone Art der Operation tun können, können Sie Ihren Code folgendermaßen vereinfachen:

private void getListItems() {
    mFirebaseFirestore.collection("some collection").get()
            .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
                @Override
                public void onSuccess(QuerySnapshot documentSnapshots) {
                    if (documentSnapshots.isEmpty()) {
                        Log.d(TAG, "onSuccess: LIST EMPTY");
                        return;
                    } else {
                        // Convert the whole Query Snapshot to a list
                        // of objects directly! No need to fetch each
                        // document.
                        List<Type> types = documentSnapshots.toObjects(Type.class);   

                        // Add all to your list
                        mArrayList.addAll(types);
                        Log.d(TAG, "onSuccess: " + mArrayList);
                    }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Toast.makeText(getApplicationContext(), "Error getting data!!!", Toast.LENGTH_LONG).show();
                }
            });
}
8
Sam Stern

Try this .. Funktioniert fein.Below-Funktion wird auch Echtzeit-Updates von Firebse erhalten ..

db = FirebaseFirestore.getInstance();


        db.collection("dynamic_menu").addSnapshotListener(new EventListener<QuerySnapshot>() {
            @Override
            public void onEvent(QuerySnapshot documentSnapshots, FirebaseFirestoreException e) {

                if (e !=null)
                {

                }

                for (DocumentChange documentChange : documentSnapshots.getDocumentChanges())
                {
                 String   isAttendance =  documentChange.getDocument().getData().get("Attendance").toString();
                 String  isCalender   =  documentChange.getDocument().getData().get("Calender").toString();
                 String isEnablelocation = documentChange.getDocument().getData().get("Enable Location").toString();

                   }
                }
        });

Weitere Hinweise : https://firebase.google.com/docs/firestore/query-data/listen

Wenn Sie keine Echtzeitaktualisierungen wünschen, lesen Sie unter dem folgenden Dokument

https://firebase.google.com/docs/firestore/query-data/get-data

1
Gowthaman M

Hier ist ein vereinfachtes Beispiel: 

Erstellen Sie eine Sammlung "DownloadInfo" in Firebase. 

Fügen Sie einige Dokumente mit diesen Feldern hinzu:

dateiname (Zeichenfolge), ID (Zeichenfolge), Größe (Nummer)

Erstellen Sie Ihre Klasse: 

public class DownloadInfo {
    public String file_name;
    public String id;
    public Integer size;
}

Code zum Abrufen der Objektliste:

FirebaseFirestore db = FirebaseFirestore.getInstance();

db.collection("DownloadInfo")
        .get()
        .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                if (task.isSuccessful()) {
                     if (task.getResult() != null) {
                            List<DownloadInfo> downloadInfoList = task.getResult().toObjects(DownloadInfo.class);
                            for (DownloadInfo downloadInfo : downloadInfoList) {
                                doSomething(downloadInfo.file_name, downloadInfo.id, downloadInfo.size);
                            }
                        }
                    }
                } else {
                    Log.w(TAG, "Error getting documents.", task.getException());
                }
            }
        });
0
live-love

Dies ist der Code, um die Liste abzurufen. Da dies eine asynchrone Aufgabe ist, dauert es einige Zeit, weshalb die Listengröße zunächst leer angezeigt wird. Wenn Sie jedoch die Quelle für die Cache-Daten angeben, bleibt die vorherige Liste (und auch ihre Größe) im Speicher, bis die nächste Aufgabe ausgeführt wird.

Source source = Source.CACHE;
        firebaseFirestore
                .collection("collectionname")
                .get(source)
                .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
                    @Override
                    public void onSuccess(QuerySnapshot documentSnapshots) {
                        if (documentSnapshots.isEmpty()) {

                            return;
                        } else {
                            // Convert the whole Query Snapshot to a list
                            // of objects directly! No need to fetch each
                            // document.
                            List<ModelClass> types = documentSnapshots.toObjects(ModelClass.class);
                            // Add all to your list
                            mArrayList.addAll(types);
                        }

                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {

                    }
                });
0
Dan