【问题标题】:Adding and Retrieving multiple values with Firebase under "User"在“用户”下使用 Firebase 添加和检索多个值
【发布时间】:2020-01-29 03:05:55
【问题描述】:

我像这样上传我的数据:

通过使用这些功能:

extension Database {

func createPurchase (purchaseID : String, quantity: String, completion: @escaping (Error?) -> ()){

    guard let uid = Auth.auth().currentUser?.uid else { return }

    let userPostRef = Database.database().reference().child("purchases").child(uid) //taken off auto ID
    let values = ["purchase" : purchaseID, "quantity" : quantity ] as [String: Any]

                    userPostRef.updateChildValues(values) { (err, ref) in
            if let err = err {
                print("Failed to save purchase to database", err)
                completion(err)
                return
            }
            completion(nil)
        }
    }

}

.

在视图控制器 1 中:

func callID (){
    let itemCount = CartController.shared.items.count

    for i in 0...itemCount-1 {

        let quantity = CartController.shared.items[i].quantity
        let quantity1 = String(quantity)
        let item = CartController.shared.items[i].product.id

        Database.database().createPurchase(purchaseID: item, quantity: quantity1 ) { (err) in
            if err != nil {
                print("error uploading purchase to Firebase ")
                return
            }
        }
    }
}

callID 使用 createPurchase 获取每个产品的 sku 编号及其数量并上传到 firebase。 但是,它会覆盖之前上传的内容。所以当我加载超过 1 个产品时。它只留下最后的产品 sku 和数量。 对于这个例子,我从 3 个产品开始,但只有 1 个(最后一个)被上传。 我怎样才能上传所有数据。即停止这个覆盖?

这是我检索它的方式:

extension Database {
    func fetchPurchase(withUID uid: String, completion: @escaping (Purchase) -> ()) {
        Database.database().reference().child("purchases").child(uid).observeSingleEvent(of: .value, with: { (snapshot) in
            guard let userDictionary = snapshot.value as? [String: Any] else { return }

            let purchase = Purchase(uid: uid, dictionary: userDictionary)
            completion(purchase)
        }) { (err) in
            print("Failed to fetch purchase from database:", err)
        }
    }
}

.

在视图控制器 2 中:

struct Purchase {

    let uid: String
    let purchases: String
    let quantities: String


    init(uid: String, dictionary: [String: Any]) {
        self.uid = uid
        self.purchases = dictionary["purchase"] as? String ?? ""
        self.quantities = dictionary["quantity"] as? String ?? ""

    }
}

var myPurchases: [Purchase] = []

private func fetchPurchaseForCurrentUser() {
    guard let currentLoggedInUserId = Auth.auth().currentUser?.uid else { return }
    Database.database().fetchPurchase(withUID: currentLoggedInUserId, completion: { (purchases) in
        self.myPurchases.append(purchases)
        print("myPurchases", self.myPurchases)
    })
}

这是我得到的打印输出:

myPurchases [myShop.Purchase(uid: "Tgb9MyxTfdTRd9tQhInsjNRXoPL2", purchases: "Z2lkOi8vc2hvcGlmeS9Qcm9kdWN0Lzk4OTUzMDk2OTk=", quantities: "2")]

这仅显示一个产品,但我需要拥有多个产品。

请帮忙!

编辑:

这是我使用 ChildByAutoId() 时的屏幕截图。 我得到所有产品(在这种情况下是 2 个)。 但我无法从快照中检索信息并设置到我的文本字段中?

【问题讨论】:

  • 您需要所有购买,或者您想用一些价值过滤它?
  • 因为 Database.database().reference().child("purchases").child(uid) 这只会返回一个值。如果您可以在屏幕截图中购买更多商品,那将会很有帮助。
  • 我只能存储一个购买值,但我想存储更多。如果我使用 ChildAutoId,那么我可以将它们全部存储起来。但是我可以全部找回吗?
  • 如果要获取所有值,请使用“Database.database().reference().child("purchases")”和单值观察者
  • 添加“child(uid)”只会给你一个匹配的结果

标签: ios swift firebase firebase-realtime-database crud


【解决方案1】:

从多条记录中准备一个数组,示例代码:

var myPurchases: [Purchase] = []
for (key, value) in userDictionary {
    guard let dic = value as? [String: Any] else {
         continue
    }

    let purchaseModel = Purchase(uid: key, dictionary: dic)
    myPurchases.append(purchaseModel)
}

【讨论】:

  • 无法识别 json.dictionaryObject
  • 我把这个放在 func fetchPurchaseForCurrentUser() 中吗?我在视图控制器中没有 userDictionary 我正在尝试获取数据
  • 您将通过 let userDictionary = purchase[uid] 在 fetchPurchaseForCurrentUser 中获取 userDictionary,然后您可以使用上面的代码为您的购买模型添加值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-01
  • 2020-04-17
  • 2017-12-07
  • 2017-01-13
  • 1970-01-01
相关资源
最近更新 更多