代码之家  ›  专栏  ›  技术社区  ›  Anvil

只有第一个添加到struct的项被上载到firebase

  •  1
  • Anvil  · 技术社区  · 6 年前

    我想上传所有信息在我的结构到Firebase,但我只得到第一个项目添加到上传。我还在一个 tableView 这很管用。

    结构文件:

    struct Products {
        var name: String = ""
        var amount = Int()
    }
    
     var prodItems : [Products] = []    
    

    结构用一个按钮填充:
    (在 name 正在从上一个传递变量 ViewController )

     @IBAction func addItemButton(_ sender: UIButton){
    
            if let index = i prodItems.index(where: { $0.name == name })   {
                prodItems[index].amount += 1
            } else {
                prodItems.append(Products(name: name, amount: 1))
            }
        }    
    

    结构填充如下表视图:

      public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
        {
            let cell = tableView.dequeueReusableCell(withIdentifier: "SummaryCell") as! SummaryTableViewCell
    
    name = prodItems[indexPath.row].name
             let amount = prodItems[indexPath.row].amount
    
            cell.summaryLabel.text = "\(amount) \(name)"
    
            return cell
        }    
    

    以上所有的工作都很好,当我尝试上传到Firebase时问题就来了。
    我正试图上传到Firebase,就像这样:

     @IBAction func orderButton(_ sender: UIButton) {
        for items in prodItems {    
          let firebaseData = "\(items.amount) \(items.name)"    
          let data = ["Uploaded" : timeStamp, "Order" : firebaseData] as [String : Any]
                self.ref?.child("Orders").child(childByAutoId).updateChildValues(data, withCompletionBlock: { (error, ref) in
                    if error != nil{
                        print(error!)
                        return
                    }    
                        break
            }
    
        }    
    

    使用此设置,我只能将第一个项目添加到Firebase。
    如果用户先添加一双鞋,然后将一条牛仔裤添加到购物车中,Firebase将只获得一双鞋。
    我怎样才能让Firebase收到全部订单?

    编辑
    New databasestructure

    我想是:。。。 "Order:" 2 Shoes, 1 Jeans, 3 Hats"
    子“顺序”后面没有0、1、2等

    Like this

    1 回复  |  直到 6 年前
        1
  •  0
  •   Nirav D    6 年前

    问题是因为 updateChildValues 它将更新特定子级的整个值,您将在for循环中调用它。尝试创建字典数组并直接设置整个数组。这样地。

    let arrayOfDic = prodItems.map({ ["Uploaded" : timeStamp, "Order" : "\($0.amount) \($0.name)"] })
    self.ref?.child("Orders").child(childByAutoId).updateChildValues(arrayOfDic, withCompletionBlock: { (error, ref) in
        if error != nil{
            print(error!)
        }    
    })
    

    编辑: 如果要将order设置为字符串值,请按如下方式设置。

    let order = array.map({ String(format: "%d %@", $0.amount, $0.name) }).joined(separator: ", ")
    let dic = ["Uploaded" : timeStamp, "Order" : order] 
    self.ref?.child("Orders").child(childByAutoId).updateChildValues(dic, withCompletionBlock: { (error, ref) in
        if error != nil{
            print(error!)
        }    
    })