繁体   English   中英

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

[英]Firebase swift - how to print out the value based on a list of specific unique key (unique key stored in array)

// 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()


        }
    })

问题有点模糊,但我认为您正在尝试根据存储在数组中的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',这样您就可以轻松查询所有Hair Care产品的Products节点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM