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?
fresco grazie Greg. Dammi un paio d'ore per tornare a casa e provare a implementare in questo modo. Grazie! – MassStrike
Ok, questo è tutto ciò di cui ho bisogno per iniziare. Grazie Greg, apprezza il supporto rapido. – MassStrike
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