Firebase swift - как распечатать значение на основе списка конкретного уникального ключа (уникальный ключ хранится в массиве) - PullRequest
0 голосов
/ 16 мая 2019

// 1. получить конкретный идентификатор и сохранить в массиве

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. получить данные из базы данных на основе идентификатора, хранящегося в массиве

    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 голосов
/ 18 мая 2019

Вопрос немного расплывчатый, но я думаю, что вы пытаетесь загрузить определенные продукты на основе идентификаторов (ключей), хранящихся в массиве?

Если это так, вы не можете сделать это напрямую

Это

.queryEqual(toValue: ArrproductID)

не будет работать, так как ArrproductID является массивом, а .queryEqual допускает только одно значение.

База данных Firebase Realtime не имеет запроса 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 обычно не рекомендует перебирать наблюдения в тесном цикле. Это может заблокировать основной поток и помешать закрытиям обновлять пользовательский интерфейс. Если это небольшой набор данных, то это не должно быть проблемой.

Если это большой набор данных, здесь могут быть лучшие способы структурировать ваши данные, чтобы получить желаемые результаты. Например, если вы хотите получить все средства по уходу за волосами, добавление к каждому ребенку поля, такого как «ProductCategory» со значением «Уход за волосами», позволит вам легко запросить узел «Продукты» для всех продуктов по уходу за волосами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...