首页 文章

Firebase快速检索用户数据

提问于
浏览
0

我只是试图从firebase为我的项目检索数据 . 例如,在UILabel中显示facebook用户名 . 我存储了像这样的facebook用户数据
enter image description here

然后使用以下方法检索数据

let ref = Firebase(url:"https://<app-name>.firebaseio.com/users/facebook:10207213459687665/name")

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

   self.facebookUserName.text = snapshot.value as! String

})

它工作得很好,但通过检索特定路径中的用户名非常愚蠢,因为这可能是不同的Facebook用户登录 .

我想检查用户是否登录并显示他们的名字或检查currentUser或更聪明的方法来执行此操作?我不知道该怎么做 .

3 回答

  • 2

    有100种不同的方法可以做到这一点;这是一对夫妇

    users
      user_id_0
        facebook_id: facebook:10207213459687665
        name: Nicholas
      user_id_1
        facebook_id: facebook:12346578912345689
        name: Frank
    

    在上面,您将查询您想要的facebook_id,它将返回节点和所有子节点(名称,地址等) . user_id_x是Firebase自动生成的节点名称(保证不同)

    ref.queryOrderedByChild("facebook_id").queryEqualToValue("facebook:12346578912345689")
       .observeSingleEventOfType(.ChildAdded, withBlock: { snapshot in
        print(snapshot.value) //prints the facebook_id and Frank
    })
    

    另一种选择是使用相同的数据结构并观察该节点以加载数据 . 请记住,facebook id是节点的KEY,而不是值 - .value是键:值对 .

    let ref = Firebase(url:"https://<app-name>.firebaseio.com/users")
    let thisUser = ref.childByAppendingPath("facebook:12346578912345689")
    
    ref.observeSingleEventOfType(.ChildAdded, withBlock: { snapshot in
    
       //snapshot will contain all of the child nodes
       let userName = snapshot.value.objectForKey("name")
       self.facebookUserName.text = userName
    
    })
    

    如果您只关心用户名,可以使用facebook id作为键来简化您的结构,值将是用户名:

    users    
     fb_10207213459687665: Nicholas
     fb_12346578912345689: Frank
    

    并使用上面的观察代码进行检索,除非您在初始问题中再次使用.value属性 .

    在这种情况下,.value属性是一个字符串,因为它是唯一的值(在您发布的结构中没有子节点,这可能会导致问题,因为它可能是一系列键:值对会崩溃)

    查询会增加一些开销,因此观察效率更高 .

  • 0

    我在http://www.appcoda.com/firebase/找到了答案

    当我们尝试从当前用户获取数据时,请在下面添加以下代码以存储uid(创建用户帐户时)

    NSUserDefaults.standardUserDefaults().setValue(result ["uid"], forKey: "uid")
    

    分配变量:

    var CURRENT_USER_REF: Firebase {
        let userID = NSUserDefaults.standardUserDefaults().valueForKey("uid") as! String
    
        let currentUser = Firebase(url: "\(BASE_REF)").childByAppendingPath("users").childByAppendingPath(userID)
    
        return currentUser!
    }
    

    实现函数代码:

    <reference>.observeEventType(FEventType.Value, withBlock: { snapshot in
    
            let currentUser = snapshot.value.objectForKey("username") as! String
            <--your code-->
            print("Username: \(currentUser)")
            self.currentUsername = currentUser
            }, withCancelBlock: { error in
                print(error.description)
        })
    }
    

    然后我们可以在直接路径中废弃参考 .

  • 0

    我有同样的问题 . 为了解决这个问题,我创建了一个自动引用登录用户的变量:

    class ViewController: UIViewController {
    let UsersRef = Firebase(url:"https://<app-name>.firebaseio.com/users")
    

    然后,在您尝试获取要显示的用户数据的@IBOutlet下,写入:

    let LoggedInUser = UsersRef.childByAppendingPath("\(UsersRef.authData.uid)")
    

    当您运行代码时,“UsersRef.authData.uid”会自动替换为当前登录用户的特定ID . 这应该创建一个指向登录用户的数据库信息的直接路径,而无需手动输入用户的ID在参考文献中 .

相关问题