在 "User" 下使用 Firebase 添加和检索多个值
Adding and Retrieving multiple values with Firebase under "User"
我正在这样上传我的数据:
通过使用这些函数:
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)
}
}
}
.
在Viewcontroller 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)
}
}
}
.
在viewcontroller 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)。
但是我无法从快照中检索信息并设置到我的文本字段?
从多条记录中准备一个数组,示例代码:
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)
}
我正在这样上传我的数据:
通过使用这些函数:
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)
}
}
}
.
在Viewcontroller 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)
}
}
}
.
在viewcontroller 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)。 但是我无法从快照中检索信息并设置到我的文本字段?
从多条记录中准备一个数组,示例代码:
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)
}