2016-06-11 43 views
6

Sto cercando di recuperare dati specifici solo dall'utente attualmente connesso. I miei dati nel mio database aspetto:Firebase Recupero dati in Swift

enter image description here

Per esempio, voglio afferrare solo il full_name e salvarlo un nome utente variabile. Di seguito è quello che sto usando per afferrare i miei dati

ref.queryOrderedByChild("full_name").queryEqualToValue("userIdentifier").observeSingleEventOfType(.ChildAdded, withBlock: { snapshot in 
      print(snapshot.value) 
      // let userName = snapshot.value["full_name"] as! String 
     }) 

Sfortunatamente, questo è ciò che stampa la mia console.

enter image description here

Gradirei qualsiasi aiuto :) Grazie!

+0

hey tim. Stai facendo l'autenticazione? per cosa stai usando? – adolfosrs

+0

sto cercando di salvare i dati su una variabile locale in modo da poterli usare per visualizzare le cose :-) – Tim

risposta

10

Ti dà quel messaggio di avviso indexOn perché stai facendo una query.

è necessario definire le chiavi su cui si indicizzerà tramite la regola .indexOn nelle regole di sicurezza e Firebase. Mentre si è permesso di creare queste query ad-hoc sul client, si vedrà notevolmente migliorare le prestazioni quando si utilizza .indexOn

Come sapete, il nome che si sta cercando si può andare direttamente a quel nodo, senza una query.

let ref:FIRDatabaseReference! // your ref ie. root.child("users").child("[email protected]") 

    // only need to fetch once so use single event 

    ref.observeSingleEventOfType(.Value, withBlock: { snapshot in 

     if !snapshot.exists() { return } 

     //print(snapshot) 

     if let userName = snapshot.value["full_name"] as? String { 
      print(userName) 
     } 
     if let email = snapshot.value["email"] as? String { 
      print(email) 
     } 

     // can also use 
     // snapshot.childSnapshotForPath("full_name").value as! String 
    }) 
+0

xcode mi ha suggerito di aggiungere un "!" dopo il valore che non sono sicuro è quello che dovremmo fare ... in effetti potrebbe essere ciò che sta causando il crash (?) – Tim

+0

è uno scartare forzatamente di un opzionale - se quel valore non esiste si bloccherà. – DogCoffee

+0

Inoltre, a seconda della progettazione del modello, è possibile che vengano restituite più istantanee. Quindi utilizzeresti snapshot.children e ti collegheranno tutti. Questo tutorial è utile per queste nozioni di base https://www.raywenderlich.com/109706/firebase-tutorial-getting-started - anche la guida introduttiva di Firebase è molto buona! https://firebase.google.com/docs/ios/setup – DogCoffee

2
{ 
    "rules": { 
     "tbl_name": { 
      ".indexOn": ["field_name1", "field_name2"] 
     }, 
    ".read": true, 
    ".write": true 
    } 
} 

è possibile applicare indexOn su qualsiasi campo. Aggiungi questo json nella scheda di sicurezza e regole delle regole. Spero che questo funzioni per voi. :)

2

recupera registrati nei dati dell'utente:

let ref = FIRDatabase.database().reference(fromURL: "DATABASE_URl") 
let userID = FIRAuth.auth()?.currentUser?.uid 
let usersRef = ref.child("users").child(userID!).observeSingleEvent(of: .value, with: { (snapshot) in 
print(snapshot) 
0

Swift 4

let ref = Database.database().reference(withPath: "user") 
    ref.observeSingleEvent(of: .value, with: { snapshot in 

     if !snapshot.exists() { return } 

     print(snapshot) // Its print all values including Snap (User) 

     print(snapshot.value!) 

     let username = snapshot.childSnapshot(forPath: "full_name").value 
     print(username!) 

    })