2015-03-16 13 views
6

Sono abbastanza nuovo per Firebase e Swift e sto avendo qualche problema quando si tratta di interrogare. Quindi ci sono fondamentalmente due cose che vorrei fare:Interrogare gli utenti per nome o indirizzo e-mail utilizzando Firebase (Swift)

  1. query miei utenti e trovano solo quelli che contengono una certa stringa nel loro nome (o l'indirizzo e-mail) e aggiungerli a un array.
  2. Ottieni tutti i miei utenti e aggiungili a un array.

La parte rilevante dei miei dati per questa domanda si presenta così: enter image description here

Come potete vedere, sto usando il simplelogin di Firebase (poi vorrei anche aggiungere Facebook login) e Sto memorizzando i miei utenti con il loro uid.

Una parte del mio file di regole si presenta così:

"registered_users": { 
    ".read": true, 
    ".write": true, 
    ".indexOn": ["name"] 
} 

Quindi tutti dovrebbero avere in lettura e scrittura a questa parte dei miei dati.

Ho letto anche la parte "Retrieving Data" della Firebase iOS Guide sul loro sito web e secondo questa guida, il mio codice su come ottenere tutti i nomi degli utenti e gli indirizzi e-mail dovrebbe funzionare, almeno credo. Ma non è così. Ecco il mio codice:

func getUsersFromFirebase() { 
     let registeredUserRef = firebaseRef.childByAppendingPath("registered_users") 
     registeredUserRef.queryOrderedByChild("name").observeSingleEventOfType(.Value, withBlock: { snapshot in 
      if let email = snapshot.value["email"] as? String { 
       println("\(snapshot.key) has Email: \(email)") 
      } 
      if let name = snapshot.value["name"] as? String { 
       println("\(snapshot.key) has Name: \(name)") 
      } 
     }) 
    } 

ho notato, che nella guida Firebase, hanno sempre utilizzato il tipo ChildAdded e non valore, ma per me valore ha più senso. L'output con Valore non è nulla e l'output con ChildAdded è solo un utente, ovvero quello che ha effettuato l'accesso in questo momento.

Quindi le mie domande sono:

  1. Posso fare questa domanda con la mia struttura dati corrente o devo per sbarazzarsi di storying gli utenti dal loro uid?
  2. Se sì, come dovrei cambiare il mio codice, per farlo funzionare?
  3. Se no, quale sarebbe il modo migliore per memorizzare i miei utenti e fare interrogazioni per nome possibile?
  4. Come posso richiedere ad es. "raccogliere" e ottenere solo l'utente simplelogin: 1 (Max Mustermann)?

Spero che la mia descrizione sia sufficientemente dettagliata. Grazie in anticipo per il tuo aiuto.

Supplemento:

La cosa strana è che la guida "Recupero di dati", dice, che l'interrogazione e l'ordinamento i seguenti dati per l'altezza è possibile.

dati:

enter image description here

codice Interrogare: enter image description here

E non è che esattamente lo stesso che ho intenzione di fare?

+0

Come possiamo salvare i dati come sono stati memorizzati? –

risposta

2

Mi sono imbattuto in situazioni simili in cui volevo estrarre i dati dai nodi figli.

https://groups.google.com/d/msg/firebase-talk/Wgaf-OIc79o/avhmN97UgP4J

La prima cosa che posso consigliare è di non pensare di query come SQL della query Firebase in quanto non sono. Sono come una query leggera.

In secondo luogo, è necessario appiattire i dati se si desidera eseguire una query, come una query va solo un livello profondo (non può davvero interrogare dati in note bambino)

Infine - se non si vuole appiattisci i tuoi dati, un'opzione concettuale per rispondere alla tua domanda;

  1. Se possibile, ObserveSingleEventOfType: FEventTypeValue sul nodo utenti registrati . Questo leggerà tutti gli utenti registrati in un'istantanea.
  2. Iterate sullo snapshot e leggere ciascun utente in un array (come oggetti del dizionario)
  3. Quindi utilizzare NSPredicate per estrarre un array di utenti che si desidera.

Ho eseguito numerosi test e prestazioni ragionevoli, è trascurabile a meno che non si disponga di migliaia di utenti.

Spero che questo aiuti!

+0

Grazie per la risposta. Ma potresti dare un'altra occhiata alla mia domanda, perché ho aggiunto qualcosa alla fine. –

+0

E un'altra cosa, sarebbe una buona idea, aggiungere un'altra voce al mio database, che memorizza i nomi di tutti gli utenti nel primo livello (per poterlo interrogare) e l'ID nel secondo livello.In questo modo ho potuto cercare Max Mustermann nel nome-db, ottenere il suo ID da lì e ottenere il resto dei suoi dati nel registered_users-db chiedendo il suo ID. O sarebbe troppo sovraccarico? Il problema è che, naturalmente, non sarei in grado di cercare indirizzi email a meno che non crei un'altra voce db con indirizzi email. E quello non può essere buono, giusto? –

+0

Nello snippit codice getUsersFromFirebase: FEEventTypeValue legge un intero nodo di dati contemporaneamente in una singola istantanea. Sarai quindi responsabile di iterare su quell'istantanea e tirare fuori i dati che desideri. Quindi all'interno del blocco, si vorrebbe sfruttare la funzionalità integrata (FDataSnapshot * child in snapshot.children) {} per ottenere ogni bambino. – Jay

-1

per rispondere alle vostre domande

1) Sì, è possibile interrogare con il vostro attuale struttura. Una query può andare 1 bambino in profondità, ma non all'interno dei figli di un bambino.

2) Se sì, come dovrei cambiare il mio codice, per farlo funzionare?

Ecco una sveltina che interroga da un'utenti cognome:

Firebase *usersNodeRef = your users node 'registered_users' 
FQuery *allUsersRef = [usersNodeRef queryOrderedByChild:@"lastName"]; 
FQuery *specificUserRef = [allUsers queryEqualToValue:@"aLastName"]; 

[specificUser observeEventType:FEventTypeChildAdded withBlock:^(FDataSnapshot *snapshot) { 

    NSDictionary *dict = snapshot.value; 
    NSString *key = snapshot.key; 

    NSLog(@"key = %@ for child %@", key, dict); 

}]; 

Come posso interrogare per esempio "raccogliere" e ottenere solo l'utente simplelogin: 1 (Max Mustermann)?

Nella struttura del nodo degli usi, gli utenti sono archiviati nei nodi con una chiave .. la chiave è il simplelogin: 1 ecc. Snapshot.key lo rivelerà. Quindi è/valore di coppia di accordo chiave ...

value = snapshot.value key = snapshot.key

Problemi correlati