Получение определенных данных из базы данных Firebase в реальном времени в Swift 5.0 - PullRequest
0 голосов
/ 23 мая 2019

Я не очень хорошо разбираюсь в firebase , но я делаю одно приложение для чата с обновлением проекта.я создал один не узел GroupChat внутри которого я создаю группу с включением членов.Теперь я хочу проверить, что если ИД пользователя доступен в узле дочернего элемента, например UserInfo / ИД пользователя .Вы можете легко понять, наблюдая за структурой ниже.AnyHelp можно оценить.enter image description here

Вот мое кодирование для извлечения данных для конкретного значения.

let questionPostsRef = Database.database().reference().child("GroupChat")
let query = questionPostsRef.queryOrdered(byChild: "UserInfo/userid").queryEqual(toValue: FireStoreApp.shared.objUser.strUserID)// Here i pass userid that i want to check in firebase.
 query.observeSingleEvent(of: .childAdded, with: { snapshot in

         print(snapshot.value)
         if !snapshot.exists() { return }
         for child in snapshot.children {
                let childSnap = child as! DataSnapshot
                let dict = childSnap.value as! [String: Any]
                print(dict)
         }
 })

Заранее благодарим за ваше драгоценное время

Ответы [ 2 ]

0 голосов
/ 23 мая 2019

Во-первых, этот код ...

.queryOrdered(byChild: "UserInfo/userid")

не работает, так как UserInfo не имеет прямого потомка идентификатора пользователя.Это дети 0, 1, 2 и т. Д.

Второе - это;в общем, лучше избегать массивов в базах данных NoSQL.

Возможное решение состоит в том, чтобы изменить структуру в соответствии с тем, что вы пытаетесь сделать.

вместо

GroupChat
   uid
      UserInfo
        0...
        1...
        2...

где 0, 1, 2 - неизвестные ... измените его на

GroupChat
   uid
      UserInfo
        uid_x
           PhotoUrl
           username
        uid_y
           PhotoUrl
           username     
        uid_z
           PhotoUrl
           username

Эта структура позволяет легко увидеть, существует ли uid в UserInfo, поскольку вы будете знать прямой путь.Это также позволяет избежать запуска запроса в целом, что экономит ресурсы (запросы тяжелее, чем прямые наблюдатели). Вот некоторый псевдокод

let pathToCheck = rootRef.child("GroupChat").child(uid).child("UserInfo").child(uid_to_look_for)

затем

pathToCheck.observeSingleEvent.... { snapshot in
  if snapshot.exists() {
     // do something with the snapshot
  } else {
     print("user does not exist in group")
  }
}
0 голосов
/ 23 мая 2019

Попробуйте следующее:

let questionPostsRef = Database.database().reference().child("GroupChat").child("LfY0_k5TakQ1EuPiGQU").child("UserInfo");
let query = questionPostsRef.queryOrdered(byChild:"userid").queryEqual(toValue: FireStoreApp.shared.objUser.strUserID)// Here i pass userid that i want to check in firebase.
query.observeSingleEvent(of: .value, with: { snapshot in

     print(snapshot.value)
     if !snapshot.exists() { return }
     for child in snapshot.children {
            let childSnap = child as! DataSnapshot
            let dict = childSnap.value as! [String: Any]
            print(dict)
     }
})

Вам необходимо пройти базу данных сверху вниз, поэтому вам нужно добавить дочерний элемент child("LfY0_k5TakQ1EuPiGQU"), чтобы затем можно было проверить, существует ли userId или нет.

Также, когда вы хотите проверить, существует ли ребенок, вам нужно использовать событие .value вместо .childadded.

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