Firebase +迅速检索用户数据

我只是试图从我的项目的Firebase检索数据。 例如,在UILabel中显示facebook用户名。 我存储这样的Facebook用户数据 在这里输入图像说明

然后使用以下命令检索数据

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

它完美的工作,但它是非常愚蠢的检索用户名称在一个特定的path,因为这可能是不同的Facebook用户login。

我想检查用户login并显示他们的名字或检查currentUser或任何更聪明的方式来做到这一点? 我不知道该怎么做。

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

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

 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属性是一个string,因为它是唯一的值(没有像你在发布的结构中的子节点,这可能会导致问题,因为它可能是一个系列的关键:值对会崩溃)

查询增加了一些开销,所以观察效率更高。

我在http://www.appcoda.com/firebase/find了答&#x6848;

当我们试图从当前用户获取数据时,添加以下代码来存储uid(创build用户帐户时)

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

分配variables:

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

然后我们可以在直接path上过时裁判。

我有同样的问题。 为了解决这个问题,我创build了一个自动引用login用户的variables:

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

然后,在试图获取用户数据的@IBOutlet下,写下:

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

运行代码时,“UsersRef.authData.uid”会自动replace为当前login用户的特定ID。这应该创buildlogin用户的数据库信息的直接path,而不必手动input用户的ID在参考中。