Firebase получение данных в Swift

Я пытаюсь получить определенные данные от пользователя, вошедшего в систему. Мои данные в моей базе данных выглядят так:

enter image description here

например, я хочу просто захватить full_name и сохранить его в переменном имени пользователя. Ниже то, что я использую, чтобы захватить мои данные

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

к сожалению, это то, что печатает моя консоль.

enter image description here

Я был бы признателен за любую помощь:) Спасибо!

5 ответов


Он дает вам это предупреждающее сообщение indexOn потому что вы делаете запрос.

вы должны определить ключи, которые вы будете индексировать через .indexOn правило в ваших правилах безопасности и Firebase. Пока вам разрешено создайте эти запросы ad-hoc на клиенте, вы увидите значительно улучшена производительность при использовании .indexOn

Как вы знаете имя, которое вы ищете, вы можете напрямую перейти к этому узлу, без запроса.

    let ref:FIRDatabaseReference! // your ref ie. root.child("users").child("stephenwarren001@yahoo.com")

    // 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
    })

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

вы можете применить indexOn к любому полю. Добавьте этот json на вкладку Безопасность и правила правил. Надеюсь, это сработает. :)


возвращает пользователю данные:

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)

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!)

    })

let ref = Database.database().reference().child("users/stephenwarren001@yahoo.com")


    ref.observeSingleEvent(of: .value, with: { (snap : DataSnapshot)  in

        print("\(String(describing:  snap.value))")


    }) { (err: Error) in


        print("\(err.localizedDescription)")

    }