2013-07-29 10 views
8

Sto utilizzando Firebase per l'archiviazione dei dati su un progetto Android e utilizzando lo Firebase Java API per gestire i dati. Non sono sicuro di farlo nel modo più efficiente possibile, tuttavia, e vorrei ricevere alcuni consigli sulle migliori pratiche per il recupero e la formattazione dei dati. Il mio repository Firebase simile a questa ....Il modo migliore per recuperare/formattare i dati utilizzando l'API Java Firebase

-POLLS 
    NUMPOLLS - 5 
    (pollskey) - NAME - Poll1 
      NUMELECTIONS - 2 
      ELECTIONS 
       (electionskey) - NAME - Election1 
         NUMNOMINATIONS - 2 
         NUMVOTERS - 2 
         NUMBERTOELECT - 1 
         VOTERS - (votesrkey) - NAME - Charles 
             NUMBER - (678) 333-4444 
           . 
           . 
           . 
           (voterskey) - ... 
         NOMINATIONS - (nominationskey) - NAME - Richard Nixon 
               NUMBEROFVOTES - 2 
             . 
             . 
             . 
             (nominationskey) - ... 
      . 
      . 
      . 
      (electionskey) - ... 
    . 
    . 
    . 
    (pollskey) - ... 

Così, per esempio qui sto cercando di ottenere tutti i dati di un sondaggio per elencare nome sondaggio, è nomi elettorali, ed i nomi di candidati e il numero di voti per ogni elezione. Ottengo urne di livello DataSnapshot durante la funzione OnCreate() della mia attività principale in questo modo ...

private static final Firebase polls = pollsFirebase.child("Polls"); 
protected void onCreate(Bundle savedInstanceState) { 

     polls.addListenerForSingleValueEvent(new ValueEventListener() { 

      @Override 
      public void onDataChange(DataSnapshot snapshot) { 
       for (DataSnapshot child : snapshot.getChildren()) { 
        if (!child.getName().equals("NumPolls")) { 
         createPollTableAndHeaders(child); 
        } 
       } 

      } 
     }); 
    } 

Poi procedere per leggere i singoli pezzi di dati che ho bisogno di te successivamente chiamando getValue() su DataSnapshots, e controllando le chiavi del conseguente HashMaps ...

private void createPollTableAndHeaders(DataSnapshot poll) { 
    String pollName = ""; 
    int numPolls; 
    Object p = poll.getValue(); 
    if (p instanceof HashMap) { 
     HashMap pollHash = (HashMap) p; 
     if (pollHash.containsKey("Name")) { 
      pollName = (String) pollHash.get("Name"); 
     } 
     if (pollHash.containsKey("Elections")) { 
      HashMap election = (HashMap) pollHash.get("Elections"); 
      Iterator electionIterator = election.values().iterator(); 
      while (electionIterator.hasNext()) { 
       Object electionObj = electionIterator.next(); 
       if (electionObj instanceof HashMap) { 
        HashMap electionHash = (HashMap) electionObj; 
        if (electionHash.containsKey("Name")) { 
         String electionName = (String) electionHash.get("Name"); 
        } 
       } 
      }; 
     } 
    } 

Questo mi sembra un modo piuttosto noioso per drill-down attraverso la struttura dei dati, e mi chiedo se c'è un modo migliore.

Ho visto il metodo getValue(java.lang.Class<T> valueType) nella documentazione, ma non sono riuscito a farlo funzionare nel mio caso, dal momento che sto lavorando con oggetti composti e non solo contenitori per tipi primitivi. Come fa la funzione a sapere quali dati Firebase assegnare a quali variabili membro di un oggetto modello? Corrisponde ai nomi delle chiavi Firebase con le variabili membro e, pertanto, devono essere esattamente uguali, con la distinzione tra maiuscole e minuscole? In che modo ciò si risolverebbe con i nomi di chiavi generati da Firebase come prodotti quando si preme su un List? Come si costruiscono oggetti modello per oggetti composti?

risposta

18

Il metodo getValue(java.lang.Class valueType) segue le stesse regole della libreria di mapping degli oggetti di jackson (è ciò che utilizziamo internamente: http://wiki.fasterxml.com/JacksonInFiveMinutes). Pertanto, le classi Java devono avere costruttori predefiniti (nessun argomento) e getter per le proprietà che si desidera assegnare (https://www.firebase.com/docs/java-api/javadoc/com/firebase/client/DataSnapshot.html#getValue(java.lang.Class)). In breve, sì, i nomi delle chiavi in ​​Firebase devono corrispondere alle variabili membro.

Per un esempio di oggetti compositi, incluso un elenco, vedere AndroidDrawing. In particolare, la classe Segment contiene un elenco di istanze Point. C'è un problema usando le liste di dati generati con il metodo .push(). Poiché i nomi di chiavi generati sono stringhe in modo che possano essere univoci tra i client, deserializzano i valori di Map s anziché List s. Tuttavia, se si itera su dataSnapshot.getChildren(), questi verranno restituiti in ordine.

Inoltre, se non si desidera deserializzare in una HashMap, è possibile utilizzare il metodo child() su DataSnapshot. Per esempio:

 

String pollName = poll.child("Name").getValue(String.class); 
DataSnapshot elections = poll.child("Elections"); 
for (DataSnapshot election : elections.getChildren()) { 
    String electionName = election.child("Name").getValue(String.class); 
} 
 

In questo esempio, tutti i valori che non esistono saranno restituiti come null.

Spero che questo aiuti!

+0

fresco grazie Greg. Dammi un paio d'ore per tornare a casa e provare a implementare in questo modo. Grazie! – MassStrike

+0

Ok, questo è tutto ciò di cui ho bisogno per iniziare. Grazie Greg, apprezza il supporto rapido. – MassStrike

+0

Mi spiace far apparire un thread vecchio, ma, sto usando GeoFire insieme a Firebase e la classe Geolocation non fornisce un costruttore predefinito. Quindi, come devo procedere alla deserializzazione di questo tipo di classe? È stata incorporata una fabbrica di deserializzazione? Grazie ! – Leonardo

1

pubblico T getValue (Classe valueType)

1.La classe deve avere un costruttore predefinito che non accetta argomenti

2. La classe deve definire getter pubblici per le proprietà da assegnare. Proprietà senza un getter pubblico verranno impostati al loro valore di default quando un'istanza viene deserializzato

controlla dal: this source Vi aiuterà a

detail

Problemi correlati