如何从Firebase检索子值,然后使用值

时间:2016-11-13 16:51:00

标签: ios swift firebase firebase-realtime-database

我刚接触编码,到目前为止只知道一点Swift。 我搜索了很多,但我没有找到这个确切的问题。

当用户按下按钮(按钮提供“新”信息)时,我需要在(详细)视图中重新加载各种相关项目。

所以,如果我有:

“标题1” “一些信息1” “按钮:”title3“”

我想按“按钮”,然后获取:

“TITLE3” “一些信息3” “按钮:”title5“”

我的Firebase数据结构是:

  1. 结果:
    • 1234
      • TITLE1
      • 一些信息1
      • ++
  2. 我曾经使用过Parse,一切都很好。在下面的代码中,我按一个按钮,然后使用按钮上的信息作为PFObject,运行基于此PFObject的查询并重新加载视图。简单。 (见例1)。

    但是在 Firebase 我真的很挣扎,(我认为它与我对数组和词典的有限理解有关...?)所以我已经从tableview发送了正确的数据到了detailview,一切都很好,工作。

    但是现在我想使用“来自button2的输入,从Firebase获取相应的数据然后刷新视图。(在Example2中尝试了一些代码) 我意识到Parse和Firebase的工作方式完全不同,但我感觉我与example2并不是那么遥远,但我可能会这样。

    感谢任何帮助。

    示例1.使用Parse的旧代码

    /* 
       ==========================================================================================
     //MARK: START OF CODE THAT MAKES BUTTONS LOAD DATA FROM PARSE
     ==========================================================================================
     */
    @IBAction func friend1(sender: AnyObject) {
        // Queries Parse to find the bottle that matches the button label when we press the button. Reloads the detail view with info from Parse
        let query = PFQuery(className:"whisky")
        query.whereKey("friendName1", equalTo: (friend1.titleLabel?.text)!)
        query.getFirstObjectInBackgroundWithBlock {
            (newBottle: PFObject?, error: NSError?) -> Void in
            if error == nil && newBottle != nil {
                //write to array
                self.testBackButton.append(self.currentObject!["friendName1"] as! String!)
                //self.testBackButton.append((self.friend1.titleLabel?.text)!)
                print(self.testBackButton)
                //end write to array
                self.currentObject = newBottle
                self.viewDidLoad()
                //self.viewWillAppear(true)
            } else {
                print(error)
            }
        }
    }
    

    示例2:尝试从Firebase执行相同操作

    @IBAction func friend1(sender: AnyObject) {
        print("hubabba")
        //dbRef.child("Results").queryOrdered(byChild: "friendName2").queryEqual(toValue: "friendName2" as? String).observe(FIRDataEventType.childAdded, with: {(_ snapshot: FIRDataSnapshot) ->
        dbRef.child("Results").queryEqual(toValue: "friendName2").observe(FIRDataEventType.childAdded, with: {(_ snapshot: FIRDataSnapshot) ->Void in
            // This will fire for each matching child node.
            var score = snapshot.value
            //var newScore = score["friendName2"]
            print("Retrieved: \(score)")
            self.detailWhisky = score as? WhiskyItem
            self.viewDidLoad()
            /*
            //test -1
    

    来自详细视图顶部的一些支持代码

    var detailWhisky: WhiskyItem?
     //Firebase
     var dbRef:FIRDatabaseReference!
    

1 个答案:

答案 0 :(得分:0)

以下代码解决了这个问题:

@IBAction func friend2Button(_ sender: Any) {
    ref.queryOrdered(byChild: "friendName1").queryEqual(toValue: self.friend2.titleLabel?.text).observe(.value, with: { snapshot in
        if snapshot.value is NSNull {
            print("Ingen treff i soeket")
        } else {
            for child in snapshot.children {
                let newWhisky = WhiskyItem(snapshot: child as! FIRDataSnapshot)
                self.detailWhisky = newWhisky
                self.viewDidLoad()
            }}})}