2016-02-22 45 views
15

Come un principiante in Firebase ho cercato di imitare un tipo di richiesta "in cui la clausola" per recuperare portafoglio dell'utente in questo semplice caso d'uso:Come utilizzare query Firebase equalTo (valore, chiave)?

User 
    48bde8f8-3b66-40bc-b988-566ccc77335c 
     email: "[email protected]" 
     username: "userTest1" 

UserWallet 
    F4PvtvNT2Z 
     coins: 26 
     someList 
     elemet1 
     elemet2 
     user: "48bde8f8-3b66-40bc-b988-566ccc77335c" 

Per prima cosa ho cercato di codificare la mia richiesta in questo modo:

Firebase root = new Firebase("https://myApp.firebaseio.com/"); 
Firebase ref = root.child("UserWallet"); 
Query query = ref.equalTo("48bde8f8-3b66-40bc-b988-566ccc77335c", "user"); 

Il risultato è stato nullo, così ho scritto questa query:

Query query = ref.orderByChild("user").equalTo("48bde8f8-3b66-40bc-b988-566ccc77335c", "user"); 

risultato era nulla di nuovo. L'unico modo per recuperare il portafoglio è stato con questa query:

Query query = ref.orderByChild("user").equalTo("48bde8f8-3b66-40bc-b988-566ccc77335c"); 

Così Dovrei avere di usare sempre en "orderByChild()" query prima di utilizzare "equalTo()"?
E così, qual è lo scopo della query "equalTo (valore String, String key)" confrontare "equalTo (String value) dal momento che solo il secondo funziona correttamente?

risposta

7

ci sono alcuni casi limite che don' t bisogno di un orderBy...(), ma in generale è necessario un orderBy...() prima di un'operazione di filtraggio (equalTo(), startAt(), endAt()).

mi raccomando di leggere prima il Firebase programming guide for Android (95% di esso vale per regolare Java troppo) Alcune ore trascorse in questa guida, salveranno decine di domande qui, ad esempio: questo è il section on queries.

Dopo aver letto ciò, si potrebbe anche voler leggere questa guida su NoSQL Data Modeling. Copre molti schemi comuni nella modellazione dei dati NoSQL e ti aiuterà a capire presto che provare a mappare query SQL su un database NoSQL è un'idea logica, ma raramente una buona idea.

mio iniziale (senza alcuna idea sui vostri casi d'uso, ad eccezione di "Ho bisogno di essere in grado di trovare i portafogli per un utente") Modello:

UserWallet 
    "48bde8f8-3b66-40bc-b988-566ccc77335c" 
     "F4PvtvNT2Z" 
     coins: 26 
     someList 
      element1 
      element2 

Nel modello di cui sopra, ho invertito il Wallet e User sotto UserWallet, in modo che la ricerca del portafoglio (s) per un utente diventa più facile.

ref.child('UserWallet').child(auth.uid).addValueEventListener(... 

Si noti che non v'è alcuna interrogazione in questione qui, così carico sarà altrettanto veloce indipendentemente dal numero di utenti che avete nel vostro database.

O in alternativa:

User 
    "48bde8f8-3b66-40bc-b988-566ccc77335c" 
     email: "[email protected]" 
     username: "userTest1" 

Wallet 
    "F4PvtvNT2Z" 
     coins: 26 
     someList 
     element1 
     element2 

UserWallet 
    "48bde8f8-3b66-40bc-b988-566ccc77335c" 
     "F4PvtvNT2Z" 

ora abbiamo completa appiattito la struttura. Per determinare i portafogli di un utente, vai a UserWaller/$uid e quindi carica ciascun portafoglio da Wallets/$walletid. Potrebbe essere un po 'più codice, ma sarà estremamente efficiente (dal momento che non ci sono domande).

+1

Grazie per la rapida risposta.Stavo cercando una specie di struttura dati che hai scritto (l'ultima) e avevo bisogno di alcune conferme; quindi è fantastico. Circa la guida di Firebase, ovviamente l'ho letta prima di fare una domanda qui, ma la relazione tra orderBy() e EqualTo() non era abbastanza chiara per me. – toofoo

+0

Se ci sono 10 portafogli per l'utente con uid = 1, devo eseguire 11 richieste, prima con '' 'UserWallet''' e le prossime 10 richieste aggiuntive. È ancora più efficiente di utilizzare una richiesta con una query? – JCarlos

+1

http://stackoverflow.com/questions/35931526/speed-up-fetching-posts-for-my-social-network-app-by-using-query-instead-of-obse/35932786#35932786 –

0

È possibile utilizzare Query annidata per questo.! se hai più ID casuale puoi facilmente confrontarli.! Riferimento riferimento database = FirebaseDatabase.getInstance(). GetReference();

Problemi correlati