Введите дочерний узел, чтобы получить необходимую информацию для входа в другой дочерний узел - PullRequest
2 голосов
/ 15 марта 2019

Я пытаюсь получить autoId, записанный в дочернем узле оповещения, и превратить его в строку, чтобы получить этот autoId из узла вопросов, чтобы получить информацию внутри него - мой код запускается, но не печатается/ work

(текущий пользовательский autoId является первым дочерним элементом узла оповещения, а userId является строкой, полученной из "objectId" / вторым дочерним элементом вопросов).Это мой код:

@IBOutlet weak var statementAnswered: UILabel
@IBOutlet weak var number1Label: UIButton!
@IBOutlet weak var number2Label: UIButton!
@IBOutlet weak var number3Label: UIButton!
@IBOutlet weak var number4Label: UIButton!

 guard let currentUser = Auth.auth().currentUser?.uid else { return }
 let ref = Database.database().reference()

    //enter alert node to get the new Id under the current user node
    let userRef = ref.child("alert").child(currentUser)
    userRef.observe(.childAdded, with: { (snapshot) in
        let uniqueKey = snapshot.key
        print(uniqueKey)
        guard let senderDetails = snapshot.childSnapshot(forPath: "from").value as? String else { return }
        guard let userID = snapshot.childSnapshot(forPath: "objectID").value as? String else { return }
        print(senderDetails)
        print(userID)

        let questionNotification = ref.child("questions").child(senderDetails).child(userID)
        questionNotification.observeSingleEvent(of: .value, with: { (snapshot) in
            let value = snapshot.value as? NSDictionary
            let statement = value?["statement"] as! String
            let number1 = value?["number 1"] as! String
            let number2 = value?["number 2"] as! String
            let number3 = value?["number 3"] as! String
            let number4 = value?["number 4"] as! String
            print(statement)
            print(number1)
            print(number2)
            print(number3)
            print(number4)

            self.statementAnswered.text = question
            self.number1Label.setTitle(number1, for: .normal)
            self.number2Label.setTitle(number2, for: .normal)
            self.number3Label.setTitle(number3, for: .normal)
            self.number4Label.setTitle(number4, for: .normal)
        })
    }, withCancel: nil)

Вот фрагмент структуры JSON:

 "alert" : {
    "FjS4wUpXAUa5aWwXkjvujHxE4He2" : {
      "-La2uIRfXs15WP8bEfQo" : {
        "from" : "Gmg1ojNoBiedFPRNSL4sBZz2gSx2",
        "objectId" : "-La2uIRPzNXnamX4QLER",
        "timestamp" : 1552696293
      }
    }
  },
  "questions" : {
    "Gmg1ojNoBiedFPRNSL4sBZz2gSx2" : {
      "-La2uIRPzNXnamX4QLER" : {
        "number 1" : "4444",
        "number 2" : "1111",
        "number 3" : "2222",
        "number 4" : "3333",
        "statement" : "favourite number",
        "selected" : "FjS4wUpXAUa5aWwXkjvujHxE4He2"
      }
    }
  },

Благодарим за любую помощь!

ОБНОВЛЕНИЕ:

Я обновил код, и на консоли он выводит следующее (autoId пользователей в приложении):

[Snap (CjeP35ceAQZJuUPhm7U1eF3Yq4F3) 1, Snap 
(FjS4wUpXAUa5aWwXkjvujHxE4He2) 1, Snap (FoFQDAGGX9hntBiBdXYCBHd8yas2) 
1, Snap (PqMkClaPM3W8k7ZSgzAHb3yne5D3) 1]
[Snap (CjeP35ceAQZJuUPhm7U1eF3Yq4F3) 1, Snap 
(FjS4wUpXAUa5aWwXkjvujHxE4He2) 1, Snap (FoFQDAGGX9hntBiBdXYCBHd8yas2) 
1, Snap (PqMkClaPM3W8k7ZSgzAHb3yne5D3) 1]
[Snap (CjeP35ceAQZJuUPhm7U1eF3Yq4F3) 1, Snap 
(FjS4wUpXAUa5aWwXkjvujHxE4He2) 1, Snap (FoFQDAGGX9hntBiBdXYCBHd8yas2) 
1, Snap (PqMkClaPM3W8k7ZSgzAHb3yne5D3) 1]

(я буду продолжать пытаться заставить мои контрольные точки работать, чтобы увидеть, что не так, иобновите его здесь, если он работает)

Заранее спасибо

ОБНОВЛЕНИЕ:

Я изменил структуру базы данных, чтобы "вопросы" не сохранялисьпод autoId currentUser (человек, отвечающий на вопросы), и вместо этого создается просто случайный идентификатор, и он работает, хотя я не думаю, что это самый эффективный способ сделать это

1 Ответ

2 голосов
/ 15 марта 2019

Проблема 1:

userRef.child (uniqueKey) .observeSingleEvent (из: .value, с: {снимок})

Тамнет необходимости снова наблюдать за обращением к пользователю, поскольку вы уже получаете необходимую информацию от наблюдения узла Alert.

Задача 2:

let questionNotification = self.ref.child ("questions"). Child (senderDetails) .child ( self.userId))

В этой строке вы ссылаетесь на идентификатор пользователя self.Глядя на ваш JSON, становится очевидным, что это поле будет динамичным, поэтому его глобальное удаление не будет разумным.

Предупреждение:

Вы должны работать по соглашению об именах.Вы назначаете имена переменных, которые даже близко не соответствуют полученному вами ответу JSON.Когда ваш проект станет больше, если вы столкнетесь с какой-либо ошибкой, вам будет трудно найти проблемы, так как вы не будете уверены, какое поле вызывает это.Также посмотрите протокол Codable.Это облегчит вашу жизнь для кодирования и декодирования объектов JSON.

Решение:

guard let currentUser = Auth.auth().currentUser?.uid else { return }
    let ref = Database.database().reference()

    //enter alert node to get the new Id under the current user node
    let userRef = ref.child("alert").child(currentUser)
    userRef.observe(.childAdded, with: { (snapshot) in
        let uniqueKey = snapshot.key
        print(uniqueKey)
        guard let senderDetails = snapshot.childSnapshot(forPath: "from").value as? String else { return }
        guard let userID = snapshot.childSnapshot(forPath: "objectID").value as? String else { return }
        print(senderDetails)
        print(userID)

        let questionNotification = ref.child("questions").child(senderDetails).child(userID)
        questionNotification.observeSingleEvent(of: .value, with: { (snapshot) in
            let value = snapshot.value as? NSDictionary
            let statement = value?["statement"] as! String
            let number1 = value?["number 1"] as! String
            let number2 = value?["number 2"] as! String
            print(statement)
            print(number1)
            print(number2)
        })
    }, withCancel: nil)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...