2016-03-19 1 views
0

In einer Firebase Android App, die ich gerade entwickle, möchte ich eine Exportfunktion bereitstellen. Diese Funktion sollte dem Benutzer ermöglichen, eine in Firebase gespeicherte Datengruppe zu exportieren.Sammeln von Daten aus Firebase asynchron: wann ist der Datensatz abgeschlossen?

Mein Plan besteht darin, alle erforderlichen Daten in einem Zwischenobjekt (Datenstruktur) zu sammeln, das für mehrere Exporttypen (wieder) verwendet werden kann.

Ich stoße auf das Problem, dass wegen der flachen Firebase-Datenstruktur, die ich verwende (wie in https://www.firebase.com/docs/android/guide/structuring-data.html erklärt), es schwierig ist zu wissen, wann alle für den Export erforderlichen Daten gesammelt wurden.

Beispiel: Beim Abrufen aller Objekte, die mit 'Indizes' referenziert werden (Name: Schlüssel, Wert true), setze ich für jeden einen Listener addListenerForSingleValueEvent, aber weil asynchrone zurückgibt, ist es unmöglich zu bestimmen, wann alle Indizes werden abgerufen. Auf diese Weise ist es nicht möglich, den richtigen Zeitpunkt zum Starten des Exports zu bestimmen.

Wer hat Best Practices für die Bewältigung?

+0

Eine Möglichkeit ist, eine Zählung der Indizes zu halten, die Sie Laden und Abnahme gestartet, wenn man kommt zurück. Wenn Sie 0 erreichen, sind Sie fertig. –

+0

Exportieren Sie diese Daten in eine flache ASCII-Datei? – Jay

+0

@Jay nein, nicht in dieser Situation, aber vielleicht in einer zukünftigen App. Warum fragst du? – Peter

Antwort

1

diese Veröffentlichung ein arbeitet Beispiel des Kommentars von @FrankvanPuffelen zu zeigen, dass die Arbeit recht gut zu tun scheint:

@Override 
public void onDataChange(DataSnapshot indexListDataSnapshot) { 
    final long participantsRequired = indexListDataSnapshot.getChildrenCount(); 

    for (DataSnapshot ds : indexListDataSnapshot.getChildren()) { 
     DataUtil.getParticipantByKey(mEventKey, ds.getKey()).addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       Participant p = dataSnapshot.getValue(Participant.class); 
       mParticipants.add(p); 

       if (participantsRequired == mParticipants.size()){ 
        executeExport(); 
       } 
      } 

      @Override 
      public void onCancelled(FirebaseError firebaseError) { 
       mListener.onDataLoadFailure(firebaseError.toException()); 
      } 
     }); 
    } 
} 
+0

Vergessen Sie nicht, Ihre eigene Antwort zu akzeptieren! –