仅将第一个添加到struct的项目上载到firebase

时间:2018-08-03 13:24:02

标签: swift firebase firebase-realtime-database struct

我想将Struct中的所有信息上传到Firebase,但是我只想添加第一项即可上传。我还在tableView中显示Struct,效果很好。

结构文件:

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))
        }
    }    

该结构将这样填充tableView:

  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。
如果用户先添加1双鞋,然后再向购物车添加1条牛仔裤,则Firebase将只获得1双鞋。
如何让Firebase接收整个订单?

EDIT
New databasestructure

我希望它是:... "Order:" 2 Shoes, 1 Jeans, 3 Hats"
没有子项“ Order”之后的0,1,2等,以此类推

Like this

1 个答案:

答案 0 :(得分:0)

问题是由于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!)
    }    
})