swift - 只有第一个添加到结构的项目被上传到 firebase

标签 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 接收整个订单?

编辑
New databasestructure

我希望它是:...“订单:”2 鞋,1 条牛仔裤,3 顶帽子“
没有 0,1,2 等跟随子“Order”

Like this

最佳答案

问题是因为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!)
    }    
})

编辑:如果您想将订单设置为字符串值,请像这样设置。

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

关于swift - 只有第一个添加到结构的项目被上传到 firebase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51673693/

相关文章:

ios - 将数据写入 firebase 而不覆盖它。 swift

swift - NSTask/bin/echo :/bin/echo: cannot execute binary file

ios - 使 Collection 符合自定义协议(protocol)

android - 将 Firebase 用于 iOS 和 Android 应用

ios - 将 child 添加到 firebase (iOS) - 新 child 的插入不会停止

ios - Firebase 云函数始终返回 Null

ios - Swift 调用 setNavigationBarHidden 但 View 不会移动到顶部

ios - 导航到下一个和上一个 subview (就像菜单)

android - Firebase 聊天应用程序 setValue 公共(public)数据库失败错误?

ios - 快速查询到 Firebase Firestore 嵌套数组