Swift:如何从firebase中检索数据?

时间:2017-06-03 10:24:28

标签: ios swift firebase

我在firebase中的结构如下:

app name
   user ID
      wins = 7
      losses = 8

和我的代码来读取wins子节点

ref = Database.database().reference().child(passUserID)
ref?.child("wins").observe(.childAdded, with: { (snapshot) in

     //Convert the info of the data into a string variable
     let getData = snapshot.value as? String
          print(getData)
})

但它什么都不打印。

2 个答案:

答案 0 :(得分:3)

要从Firebase读取数据,请将侦听器附加到创建FIRDatabase引用的路径。 FIRDatabaseReference表示Firebase数据库中的特定位置,其中存在子项的键值对列表。因此,在您的情况下,您已创建Firebase对密钥的引用" wins"它只指向一个值而不是一个键值对。到目前为止,您的引用是有效的:

    ref = Database.database().reference().child(passUserID) 

    //did you mean FIRDatabase and not Database??

这个FIRDatabaseReference指向密钥passUserID,它有一个子项的键值对列表[" wins":" 7"]和[" loss": " 8"](注意:一个键总是一个字符串)。因此,从FIRDatabase引用中,您可以按如下方式创建观察者并读取" wins"的值:

   ref?.observe(.childAdded, with: { (snapshot) in

    //Convert the info of the data into a string variable
    if let getData = snapshot.value as? [String:Any] {

        print(getData)

        let wins = getData["wins"] as? String

        print("\(wins)")

    }

})

对于每个现有数据,Child添加事件将触发一次,快照值将是单个记录,而不是像使用value事件获得的整个列表。随着更多物品的进入,此活动将随每件物品开启。所以如果"损失"是第一个你可能没有得到" wins"的值的记录。这是你想要实现的目标吗?如果你真正想知道的是"胜利"在该特定位置并且要知道该值是否曾经改变过,您应该使用.value观察者,如下所示:

    ref?.observe(.value, with: { (snapshot) in

    //Convert the info of the data into a string variable
    if let getData = snapshot.value as? [String:Any] {

        let wins = getData["wins"] as? String

        print("\(wins)") //check the value of wins is correct

    }

})

或者,如果您只是想知道胜利的价值一次而且您并不担心知道是否有任何变化,请使用" observeSingleEvent"而不是"观察"。

修改

我看到了您的图片,现在意识到您的参考可能也有问题。你的裁判应该是这样的:

    ref = FIRDatabase.database().reference().child("game-").child(passUserID)

你已经模糊了#34;游戏"只是对#34;胜利"的有效参考;将包括它。

第二次编辑

我将添加以下内容,以便您可以正确调试问题。使用此模式观察值,看看是否返回错误,说明了什么:

        ref.observe(.value, with: { (snapshot) in

             print(snapshot)

        }, withCancel: { (error) in

            print(error.localizedDescription)

        })

如果由于数据库规则而无法访问Firebase位置,通常会出现错误。查看print(快照)是否返回上述任何内容也是一个好主意。

答案 1 :(得分:0)

你需要这个:

    ref.child("YOUR_TOP_MOST_KEY").observe(.childAdded, with: { (snapshot) in
        let keySnapshot = snapshot.key
        //print(keySnapshot)
        self.ref.child(keySnapshot).observe(.value, with: { (snapshot2) in
        //print(snapshot2)
        }) { (error) in
            print("error###\(error)")

        }

    })