简体   繁体   English

Firebase 在 Swift 中检索数据

[英]Firebase Retrieving Data in Swift

I'm trying to retrieve specific data from just the currently logged in user.我正在尝试仅从当前登录的用户中检索特定数据。 My data in my database looks like this:我的数据库中的数据如下所示:

在此处输入图片说明

For example, I want to just grab the full_name and save it in a variable userName.例如,我只想获取 full_name 并将其保存在变量 userName 中。 Below is what I'm using to grab my data以下是我用来获取数据的内容

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

Unfortunately, this is what my console prints.不幸的是,这是我的控制台打印的内容。

在此处输入图片说明

I would appreciate any help :) Thank you!我将不胜感激:) 谢谢!

It gives you that warning message indexOn because you are doing a query.它为您提供警告消息indexOn因为您正在执行查询。

you should define the keys you will be indexing on via the .indexOn rule in your Security and Firebase Rules.您应该通过安全和 Firebase 规则中的 .indexOn 规则定义您将索引的键。 While you are allowed to create these queries ad-hoc on the client, you will see greatly improved performance when using .indexOn虽然您可以在客户端上临时创建这些查询,但使用 .indexOn 时,您会看到性能大大提高

As you know the name you are looking for you can directly go to that node, without a query.正如您知道要查找的名称一样,您可以直接转到该节点,无需查询。

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

Swift 4斯威夫特 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!)

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

You can apply indexOn on any field.您可以在任何字段上应用 indexOn。 Add this json in rules security and rules tab.在规则安全和规则选项卡中添加此 json。 Hope this works for you.希望这对你有用。 :) :)

It retrieves logged in user data:它检索登录的用户数据:

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

    }
    var refDatabase = DatabaseReference()

    refDatabase = Database.database().reference().child("users");
 let refUserIdChild = refDatabase.child("stephenwarren001@yahoo.com")
                    
                    refUserIdChild.observeSingleEvent(of: .value, with: { snapshot in

                        if !snapshot.exists() { return }

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

                        print(snapshot.value!)
                        

                    if let tempDic : Dictionary = snapshot.value as? Dictionary<String,Any>
                    {
                           
                            if let userName = tempDic["full_name"] as? String {
                                  self.tfName.text = userName

                              }

                            if let email = tempDic["email"] as? String {
                                    self.tfEmail.text  = email

                              }

                           
                    }


                    })
                    

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM