Чтение Firebase ребенка с помощью автоматического идентификатора swift - PullRequest
0 голосов
/ 12 июня 2018

Это быстрый вывод моего дерева Firebase, например, чтобы получить доступ к узлу people_on_this_planit / userID.Моя единственная проблема заключается в том, что узел находится внутри автоматического идентификатора;Пожалуйста, любая помощь будет оценена.Спасибо

  planits
 -LEmgxuG_13KNA5inRaB
     Planit Title: "Some title"
     people_on_planit
      -LEmh6IxqguVBJEwghZv (auto ID)
         userID: "kkdiEW0D9"
     senderId: "39FdLfdIO8832"

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

ref = Database.database().reference()
let userID = Auth.auth().currentUser?.uid       
let planitsRef = ref.child("planits")

for child in snapshot.children {

    let childSnap = child as! DataSnapshot
    let dict = childSnap.value as! NSDictionary
    let planKey = childSnap.key
    //print(planKey)

    print(dict)


    let title = dict["Planit Title"] as! String
    let senderID = dict["senderId"] as! String
    let peopleOnPlanit = dict["people_on_planit"] as? String

    print(peopleOnPlanit)
}

1 Ответ

0 голосов
/ 12 июня 2018

Вот код для чтения структуры Firebase, предложенной в вопросе

let planitsRef = self.ref.child("planits")
planitsRef.observeSingleEvent(of: .value, with: { snapshot in

    for child in snapshot.children {
        let planSnap = child as! DataSnapshot
        let planDict = planSnap.value as! [String: Any]
        let title = planDict["plan_title"] as! String
        let senderId = planDict["sender_id"] as! String
        print("plan title: \(title)  senderId: \(senderId)")
        let peopleOnPlanitSnap = planSnap.childSnapshot(forPath: "people_on_planit")

        for peopleChild in peopleOnPlanitSnap.children {
            let peopleChildSnap = peopleChild as! DataSnapshot
            let userSnapDict = peopleChildSnap.value as! [String: Any]
            let userId = userSnapDict["user_id"] as! String
            print("  userId: \(userId)")
        }
    }
})

и вывод

plan title: Some title  senderId: 39FdLfdIO8832
  userId: uid_0
  userId: uid_1

- пара замечаний -

Поскольку связанные пользователи, кажется, хранятся по их идентификатору пользователя, и это единственные данные, хранящиеся в этом узле, вы можете изменить этот узел

people_on_planit
      -LEmh6IxqguVBJEwghZv (auto ID)
         userID: "kkdiEW0D9"

, чтобы он выглядел следующим образом

people_on_planit
   uid_x: true //uid_x would be kkdiEW0D9 etc
   uid_y: true

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

также обратите внимание, что я немного изменил соглашение об именах;вы можете форматировать ключи как хотите, но я выбрал такие ключи, как plan_title вместо PlanIt Title и sender_id и user_id вместоsenderId и userId.Моя практика заключается в том, что для настоящих ключей Firebase я использую все строчные буквы, подчеркивание вместо пробелов, а в коде я использую строчные / прописные буквы без пробелов.Поэтому, если вы скопируете и вставите мой код, вам нужно будет их изменить.

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