Firebase Swift-如何根据特定的唯一键(存储在数组中的唯一键)列表打印出值

时间:2019-05-16 17:48:35

标签: swift firebase firebase-realtime-database

// 1。检索特定的ID并存储在数组中

let uid = Auth.auth().currentUser?.uid
        Database.database().reference().child("users").child(uid!).child("cart").observeSingleEvent(of: .value, with: { (snapshot) in


        if let snapDict = snapshot.value as? [String:AnyObject]{

            for each in snapDict as [String:AnyObject]{

                let refID = each.value["refID"] as! String
                self.ArrproductID.append(refID) //append to array

            }
             //print(self.ArrproductID)
        }

    })
    { (error) in
        print(error.localizedDescription)
    }

// 2。根据数组中存储的ID从Firebase检索数据

    refProduct = (Database.database().reference().child("Product").queryOrderedByKey().queryEqual(toValue: ArrproductID) as! DatabaseReference)

    refProduct.observe(DataEventType.value, with:{(snapshot) in
        if snapshot.childrenCount>0{
            self.productList.removeAll()

            for Product in snapshot.children.allObjects as![DataSnapshot]{

                let productObject = Product.value as? [String: AnyObject]
                let ID = Product.key
                let ProductName = productObject?["ProductName"]
                let ProductPrice = productObject?["ProductPrice"]
                let ProductImage = productObject?["ProductImage"]



                //refer to the productmodel.swift? //2. store into model?
                let product = ProductModel( ProductId: ID as String?, ProductName: ProductName as! String? , ProductPrice: ProductPrice as! String?, ProductImage: ProductImage as! String?)


                //3. apend all product to list
                self.productList.append(product)



            }
            //reload all the data?
            self.CartItemView?.reloadData()


        }
    })

1 个答案:

答案 0 :(得分:0)

这个问题有点模糊,但是我想您正在尝试根据存储在数组中的ID(密钥)加载特定产品?

如果是这样,您将无法直接这样做

.queryEqual(toValue: ArrproductID)

将不起作用,因为ArrproductID是一个数组,并且.queryEqual仅限于单个值。

Firebase实时数据库没有“ IN”查询。为此,您需要遍历数组中的每个值并检索乘积。

假设您的结构看起来像这样

Products
   product_0
      ProductName: "Shampoo"
      ProductPrice: "$1.99"
      ProductImage: "some url"
   product_7
      ProductName: "Milk"
      ProductPrice: "$2.99"
      ProductImage: "another url"

然后是读取存储在数组中的特定产品的代码

func getProducts() {
    let productArray = ["product_0", "product_7"]
    let productsRef = self.ref.child("Products")

    for productId in productArray {
        let thisProductRef = productsRef.child(productId)
        thisProductRef.observeSingleEvent(of: .value, with: { snapshot in
            let name = snapshot.childSnapshot(forPath: "ProductName").value as? String ?? "No Name"
            let price = snapshot.childSnapshot(forPath: "ProductPrice").value as? String ?? "$0.00"
            let image = snapshot.childSnapshot(forPath: "ProductImage").value as? String ?? "No Image"
            print(name, price, image)
        })
    }
}

输出为

Shampoo $1.99 some url
Milk $2.99 another url

请记住,Firebase通常不建议在紧密循环中进行观察。这可能会阻塞主线程并阻止闭包更新UI。如果它是一个很小的数据集,那应该不是问题。

如果数据集较大,则可以使用以下更好的方法来构造数据以获得所需的结果。例如,如果要获取所有护发产品,则向每个孩子添加一个字段,例如“ ProductCategory”,其值为“ Hair Care”,则可以轻松查询所有护发产品的“产品”节点。