Подсчет записей в Swift с Firebase с помощью оператора Where - PullRequest
0 голосов
/ 20 января 2020

Я пытаюсь вернуть количество сообщений для определенного пользователя c, где поле содержит определенное значение. Структура, которую я использую в Firebase, здесь:

{
  "posts" : {
    "-Lyzpsb1hH4LUPvcXE3H" : {
      "beverageCategory" : "Beer",
      "beverageName" : "Dortmunder",
      "beveragePrice" : "3.99",
      "beverageRating" : 3,
      "beverageType" : "Lager",
      "imageUrl" : "https://firebasestorage.googleapis.com/v0/b/socialspirit-37cae.appspot.com/o/post-pics%2F3C23E923-A3BD-4393-B3EF-8F939D8B08B8?alt=media&token=ac80cb98-f2a1-4197-b328-2a69a2ac1fd1",
      "wineVintage" : ""
    }
  },
  "user" : "sdkjvksdjf",
  "users" : {
    "0hyN8N2klJWqPi2lkRqNK3vg7z63" : {
      "posts" : {
        "-Ly6ciYHm7v5JFy1VmVY" : true,
        "-Ly6cyLukI6aRRki5yna" : true
      },
      "provider" : "Firebase"
    },
    "26OUuaRZEVWUmkLJp13LzirGbs13" : {
      "posts" : {
        "-Ly6fGmQEMZz3c-azMnJ" : true
      },
      "provider" : "Firebase"
    },
    "5r6FulsvIRap7pLK5D3zV8qyPVv1" : {
      "provider" : "Firebase"
    },
    "gQpktBMh97hTqiysHBwvVLZl70y1" : {
      "posts" : {
        "-Lyzpsb1hH4LUPvcXE3H" : true,
        "-LyzqFgvmrBgdsgKSt_5" : true,
        "-Lz-fIMDal00ex3_viQo" : true,
        "-Lz-lXsSBqKlcf8hBext" : true,
        "-Lz2eNLfk1PFEVkEgmwa" : true,
        "-Lz2etF0UqFqLkdGOR13" : true,
        "-Lz2fGUi0qzJtniNr5LX" : true,
        "-Lz2gP5c47yHDO2g0ljr" : true,
        "-Lz2gdhfedZfTtzjP2ee" : true,
        "-Lz2gllC3caXgPf2VAPU" : true,
        "-Lz2hH8FbNmBEOLcHCJz" : true,
        "-Lz2jzkXuEZ3Cfe96eGW" : true,
        "-Lz3RvuW4fMXarhW7vLv" : true,
        "-Lz3S8YA0vgk4ZrjL_Kk" : true
      },
      "provider" : "Firebase"
    }
  }
}

Я использую следующий код, чтобы получить количество записей с категорией напитков "Пиво".

DataService.ds.REF_USERS.child("\(uid)").child("posts").child("beverageCategory")
.queryOrderedByValue().queryEqual(toValue: "Beer")
.observe(DataEventType.value, with: { (snapshot)     in
    print("SNAP - \(snapshot.childrenCount)")
})

childrenCount возвращает 0, однако. Есть идеи, что я здесь делаю не так? Спасибо!

РЕДАКТИРОВАТЬ: я добавил JSON для структуры данных, и я думаю, что я пропустил важную деталь. Структура данных на самом деле имеет users, которая имеет posts, и связанную postid, которая связана с posts. Я думаю, что мне нужно сначала найти сообщения пользователя, а затем из этих сообщений получить общее количество для каждой категории. Я предполагаю, что это немного отличается от методов, которые я пробовал. Есть идеи по этому поводу?

РЕДАКТИРОВАТЬ 2: Итак, мои проблемы в том, что users и posts находятся в разных структурах. Мне нужно найти все пользовательские posts и просмотреть их, чтобы узнать, что это за beverageCategory. Я сделал это с помощью следующего кода. Проблема с кодом ниже в том, что счетчик удваивается, когда я добавляю post и затем открываю меню. Но когда я выхожу из меню и снова открываю счет считается правильным. Почему это двойной счет?

func myFirebaseNetworkDataRequest(finished: @escaping () -> Void) { 
    beerCountArray.removeAll()
    wineCountArray.removeAll()
    liquorCountArray.removeAll()

    print("BEER ARRAY \(beerCountArray.count)")

    guard let uid = Auth.auth().currentUser?.uid else {
        return
    }
    let newPost = DataService.ds.REF_USERS.child("\(uid)").child("posts")

    newPost.observe(.value, with: { (snapshot) in
         if let snapshot = snapshot.children.allObjects as? [DataSnapshot] {
             //print("SNAPSHOT - \(snapshot)")
             for snap in snapshot {
                 let postData = DataService.ds.REF_POSTS.child(snap.key)
                 //print("SNAP KEY - \(snap.key)")
                 let bevCat = DataService.ds.REF_POSTS.child(snap.key).child("beverageCategory")
                 //print("BEV CAT - \(bevCat)")
                 postData.observe(.value, with: { (snapshot) in
                     if let postDict = snapshot.value as? Dictionary<String, AnyObject> {
                         let key = snapshot.key
                         let post = Post(postKey: key, postData: postDict)
                         //print("POST DICT - \(String(describing: postDict["beverageCategory"]!))")
                        if postDict["beverageCategory"]! as! String == "Beer" {
                            self.beerCountArray.append(1)
                            //print("BEER ARRAY LOOP - \(self.beerCountArray)")
                         }
                        if postDict["beverageCategory"]! as! String == "Wine"{
                            self.wineCountArray.append(1)
                         }
                        if postDict["beverageCategory"]! as! String == "Liquor" {
                            self.liquorCountArray.append(1)
                        }
                         //self.posts.append(post)
                     }
                     finished()
                 })
             }
         }

     })

}

И ...

 override func viewDidLoad() {
        super.viewDidLoad()

        beerCountArray.removeAll()
        wineCountArray.removeAll()
        liquorCountArray.removeAll()

        myFirebaseNetworkDataRequest {

            //print("BEER ARRAY - \(self.beerCountArray.count)")
            self.beerCount.text = String(self.beerCountArray.count)
            self.liquorCount.text = String(self.liquorCountArray.count)
            self.wineCount.text = String(self.wineCountArray.count)
        }
}

1 Ответ

1 голос
/ 20 января 2020

Ваш запрос не верный. Поскольку вы пытаетесь отфильтровать дочернее свойство каждого узла в posts, вы должны вызвать queryOrdered(byChild:).

Итак:

DataService.ds.REF_USERS.child("posts")
  .queryOrdered(byChild: "beverageCategory")
  .queryEqual(toValue: "Beer")
  .observe(DataEventType.value, with: { (snapshot)     in
    print("SNAP - \(snapshot.childrenCount)")
  })

Также см. Документацию Firebase по заказ и фильтрация данных .

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