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