Доступ к ключу childByAutoID от ребенка - PullRequest
0 голосов
/ 17 марта 2020

У меня есть структура Firebase, подобная этой:

...    
  "objects" : {
    "-M2ToRL-DOIL5B7Kq1JH" : {
      "name" : "Orange",
      "weight" : 50,
      "color" : "Orange",
      "objectID" : "-M2ToRL-DOIL5B7Kq1JH"
    },
    "-M2U20-rpaaWBWnXjirx" : {
       "name" : "Banana",
      "weight" : 20,
      "color" : "Yellow",
      "objectID" : "-M2U20-rpaaWBWnXjirx"
    }
  },     

Я хочу получить доступ к ключу childByAutoID. У меня такой запрос, но он ничего не дает ..

ref?.child("objects").queryOrdered(byChild:"name").queryEqual(toValue: name).observeSingleEvent(of: .value, with: { (snapshot) in

                if snapshot.exists() {
                    print(snapshot)
                    let value = snapshot.value as? NSDictionary
                    var key = ""
                    key = value?["objectID"] as? String ?? "Error"

                } else {

                    return
                }

            }, withCancel: {(Error) in
                print(Error.localizedDescription)
            })     

Я также пытался получить value.key, но безуспешно. Как я могу получить ключ, либо от самого ребенка, либо из сохраненного значения objectID?

Ответы [ 2 ]

0 голосов
/ 17 марта 2020

Если вы используете childByAutoId в качестве ключа, обычно нет причин дублировать эти данные внутри узла, так как вы можете напрямую получить доступ к ключу.

Например

ref?.child("objects").queryOrdered(byChild:"name").queryEqual(toValue: name).observeSingleEvent(of: .value, with: { snapshot in
    if snapshot.exists() == false {
        print("none found, returning")
        return
    }

    let allResults = snapshot.children.allObjects as! [DataSnapshot]
    for snap in allResults {
        print(snap.key) //prints each child key
    }
0 голосов
/ 17 марта 2020

Если вы хотите получить значение "-M2ToRL-DOIL5B7Kq1JH", вам нужно выполнить итерацию для доступа к нему:

ref?.child("objects").queryOrdered(byChild:"name").queryEqual(toValue: name).observeSingleEvent(of: .value, with: { (snapshot) in
             for child in snapshot.children.allObjects as! [DataSnapshot]{
                print(child.key);
                if snapshot.exists() {
                    print(snapshot)
                    let value = snapshot.value as? NSDictionary
                    var key = ""
                    key = value?["objectID"] as? String ?? "Error"

                } else {

                    return
                }
             }

            }, withCancel: {(Error) in
                print(Error.localizedDescription)
            })  

Поскольку ваша ссылка находится на узле objects, то для доступа к ключу, который вы используете для l oop, а затем используйте свойство key

Проверьте здесь для получения дополнительной информации:

https://firebase.google.com/docs/reference/swift/firebasedatabase/api/reference/Classes/DataSnapshot#key

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