2016-06-11 90 views
6

我试图从当前登录的用户检索特定数据。我在我的数据库中的数据是这样的: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

我希望得到任何帮助:)谢谢!

+0

哎添。你在做认证吗?你在用什么? – adolfosrs

+0

即时尝试将数据保存到本地变量,所以我可以用它来显示的东西:-) – Tim

回答

10

由于您正在进行查询,因此会显示该警告消息indexOn

您应该通过安全和Firebase规则中的.indexOn 规则来定义要编入索引的密钥。当你被允许 在客户端上创建这些查询临时,你会使用.indexOn

当看到大大 提高性能

你知道你正在寻找你的名字可以直接到该节点,没有查询。

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建议我添加一个“!”在我不确定的价值之后是我们应该做的事情......事实上,这可能是导致它崩溃的原因(?) – Tim

+0

它是一个可选的力量 - 如果该值不存在,它会崩溃。 – DogCoffee

+0

还取决于您的模型设计,您可能会收回多个快照。那么你会使用snapshot.children并遍历它们。本教程适用于这些基础知识https://www.raywenderlich.com/109706/firebase-tutorial-getting-started-火焰基础入门指南也非常好! https://firebase.google.com/docs/ios/setup – DogCoffee

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

您可以在任何领域应用indexOn。在规则安全性和规则选项卡中添加此json。 希望这对你有用。 :)

2

它检索登录的用户数据:

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

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

    })