Firebase将多个子值保存到数组

时间:2017-09-10 10:41:41

标签: arrays swift3 firebase-realtime-database

查看我的firebase数据库的结构: enter image description here

我试图将每个加密货币的每个密钥的值保存到单独的数组中。

例如,' coinAmount'关键,我想得到一个类似于[" 1.0," 2.0"]和' coinName'作为["比特币","以太坊"]等5个键中的每一个。

我的尝试:

let index = NSIndexPath(item: 0, section: 0)
    if portfolioCoinFullNameString.count > 0 {
        print("PortfolioVC: Number of Coins in Portfolio > 0")
            let coinRef = ref.child("\(portfolioCoinFullNameString[index.row])")

            coinRef.observe(DataEventType.value) { (snapshot) in
                for child in snapshot.children {
                    let snap = child as! DataSnapshot
                    let key = snap.key
                    let value = snap.value
                    print("key = \(key) ,, value = \(value!)")
                    if key == "coinAmount" {
                        self.firebaseCoinAmountArray.append(Double(value as! String)!)
                    } else if key == "coinName" {
                        self.firebaseCoinNameArary.append(value as! String)
                    } else if key == "coinPrice" {
                        self.firebaseCoinPriceArray.append(Double(value as! String)!)
                    } else if key == "coinSymbol" {
                        self.firebaseCoinSymbolArray.append(value as! String)
                    } else if key == "coinTotalFiat" {
                        self.firebaseCoinTotalFiatArray.append(Double(value as! String)!)
                    } else {
                        print("PortfolioVC: Key does not match anything!")
                    }
                }
            }
    } else {
        print("PortfolioVC: Number of Coins in Portfolio !> 0")
    }

这适用于添加第一枚硬币,但是当我尝试添加第二枚硬币时,2个值会附加到数组中,因此它包含3个,如果我添加第三个硬币,则会附加3个值。不确定为什么它会循环通过每个硬币?

编辑: 我在StackOverflow周围搜索并遇到了另一种方法:

let index = NSIndexPath(item: 0, section: 0)
    if portfolioCoinFullNameString.count > 0 {
        print("PortfolioVC: Number of Coins in Portfolio > 0")
            let coinRef = ref.child("\(portfolioCoinFullNameString[index.row])")

            coinRef.observe(DataEventType.value) { (snapshot) in
                let value = snapshot.value as? NSDictionary
                let coinName = value?["coinName"] as? String ?? ""
                    self.firebaseCoinNameArary.append(coinName)
                print("aaaaaa:\(self.firebaseCoinNameArary)")
            }
    } else {
        print("PortfolioVC: Number of Coins in Portfolio !> 0")
    }

但仍有问题,当在阵列中添加任何硬币作为第二个元素时,该阵列包含3x第一枚硬币而不是仅仅两枚第一枚硬币和第二枚硬币。我知道我可以做一个if语句来检查数组是否已经包含该名称,如果它不添加它,但我如何使用数值作为theres可能硬币可能具有相同的价格。? p>

Edit2:一直在考虑它,如果我只是观察值而不是更改,它会工作吗,保存所有的数组,用它们填充单元格。然后,如果用户编辑了'coinAmount'应用中的值,它会在Firebase中更新,但不会在阵列中更新。然后,当用户关闭应用程序/注销时,下一次显示组合时,它将从firebase中重新提取包含更新数字的值?

Edit3:此外,投资组合下的节点称为比特币'等等,如果我称他们为coin1,coin2,coin3等,我将如何获得该路径并获得说币3的关键和价值?有没有办法只获得' protfolio'下的所有节点的值?一气呵成?

我的想法是,一旦我将所有firebase数据保存到数组中,我将使用所有数据填充tableview单元格。

感谢任何帮助:)

谢谢,

杰里米

1 个答案:

答案 0 :(得分:0)

为了做到这一点,不要使用for循环使用.childAdded

我将提供一个例子

database.ADD THE ENTIRE PATH.child("portfolio").observe(DataEventType.childadded) { (snapshot) in


                let key = snapshot.key
                let value = snapsnapshot.value as? NSDictionary

                //Add everything that is in your firebase
                let coinAmount = value?["coinAmount"] as? String
                let cointName = value?["coinName"] as? String
                //.... Added all the variables for the database


                //use the variables above and append the array and it will work! 
            }
        }