База данных Firebase Чтение childByAutoId - PullRequest
0 голосов
/ 23 мая 2018

В настоящее время я изучаю веревки в Firebase для iOS, так что обнажите мои навыки новичка.

Ниже приведен скриншот моей базы данных:

gZ7dn2LMkiah - это autoId для пользователя
LDBTRFVS8dtz и LDBTe4oXs - это autoId для childId для этого пользователя

enter image description here

Как я могу прочитать два дочерних узла внутри узла gZ7dn2LMkiah?
Потому что из моего кода ниже, это возможно, только если у меня есть только один дочерний элемент под этим узлом, а не два

ref = Database.database().reference()
    let userId: String = (Auth.auth().currentUser?.uid)!

    databaseHandle = ref?.child("childId").child(userId).observe(.childAdded, with: { (snapshot) in


Я пытался добавить childByAutoId после child(userId), но этоне дал никаких результатов.

Любая помощь будет оценена.Заранее спасибо.

Ответы [ 2 ]

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

Прежде всего, ваш БД кажется неверным.В первом узле nick and relation находятся внутри autoGeneratedKey, а во втором узле nick and relation находятся вне ключа, так как оба видны, пока узел находится в состоянии сбоя.Таким образом, эти значения должны быть внутри autoGeneratedKey.Пожалуйста, измените вашу структуру БД в правильном порядке.Смотрите скриншот ниже:

enter image description here

Это будет ваша таблица childs, содержащая всех потомков для всех родителей, и вы можете запросить конкретного родителя, чтобы получить егоДети.Ниже приведен фрагмент кода:

 ref.child("childs").queryOrdered(byChild: "parentId").queryEqual(toValue: "123").observeSingleEvent(of: DataEventType.value) { (snapshot) in
     if snapshot.exists() {
         print("exists")
         for child in snapshot.children {
             let data = child as! DataSnapshot
             print(data.key)
             print(data.value)
         }
     }
     else {
         print("doesn't exist")
     }
 }

Вывод:

-LDBus9Xas3oTccwPN4r
Optional({
    nick = Dave;
    parentId = 123;
    relation = Son;
})
-LDBus9_Uz_qe69e9CXK
Optional({
    nick = Susan;
    parentId = 123;
    relation = Daughter;
})

Где parentId равно let userId: String = (Auth.auth().currentUser?.uid)!.

Примечание 1: Я пытался добавить childByAutoId после child(userId), но он не дал никаких результатов.

Да, это не будет работать, потому что childByAutoId создать новый ключ, который никогда не будет совпадать с существующими ключами БД, поэтому вы ничего не получите.

Примечание 2: Когда использовать .childAdded

.childAdded - это прослушивание новой записи для ссылки на узел, а не выборкаданные.Чтобы получить данные за один раз, мы должны использовать событие .observeSingleEvent.

Примечание 3: Причина в моем коде ниже, это может быть возможно, только если у меня есть только один дочерний элемент под этим узлом,не два

Нет, это невозможно.Это просто потому, что вторые узлы nick и relation находятся вне ключа.

0 голосов
/ 23 мая 2018
Database.database().reference(withPath: 
 "childId").child(userId).observe(.childAdded)
   { (snapshot:DataSnapshot) in    
       // This will print all sub node  
      print(snapshot)
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...