Правильный способ получения значений в Firebase - PullRequest
0 голосов
/ 17 января 2019

Я довольно новичок в Firebase, читал документы и пробовал несколько решений. Как я могу получить данные "friendID" в следующей структуре. Мне нужно получать эти данные только один раз при каждой загрузке этого представления.

enter image description here

А вот и моя последняя попытка.

let profileDB = Database.database().reference().child("Profiles")
profileDB.child(userID!).child("friends").observeSingleEvent(of: .value, with: {
(snapshot) in

    let dbValue = snapshot.value as? NSDictionary

    if let friend = dbValue?["friendID"] {
        print(friend)
    }
})

UPDATE

Если я сделаю это:

let dbValue = snapshot.value as? NSDictionary
print(dbValue)

OR

let dbValue = snapshot.value
print(dbValue)

Тогда я получаю это, но не знаю, как получить доступ к клавише friendID.

Optional({
"-LWS8PMygzX2Lk-hOGvT" =     {
    friendID = qvhN5UMnbOWvfhhN4RAHtwjLuwG2;
};
"-LWS8PNFdUGMI1gHO8TF" =     {
    friendID = w3f7yLMdArUrnKLWR1nyE7ko1ds1;
};
})

Если я перейду на это, то это сработает. Но не лучше ли первый метод наблюдения, описанный выше, для одноразовых поисков?

profileDB.child(userID!).child("friends").observe(.childAdded) {
(snapshot) in

    let dbValue = snapshot.value as! Dictionary<String,String>

    if let friend = dbValue["friendID"] {
        print(friend)
    }
}

Мой последний вопрос будет, как только я получу этот идентификатор друга, как я могу загрузить их информацию? Буду ли я снова вызывать БД внутри этого наблюдателя? Это похоже на работу:

let profileDB = Database.database().reference().child("Profiles")

profileDB.child(userID!).child("friends").observe(.childAdded) {
(snapshot) in

    let dbValue = snapshot.value as! Dictionary<String,String>

    if let friendID = dbValue["friendID"] {
    print(friendID)

    let friendProfileDB = Database.database().reference().child("Profiles")
    friendProfileDB.child(friendID).observeSingleEvent(of: .value, with: {
    (snapshot) in

        let friendDBValue = snapshot.value as? NSDictionary

        if let name = friendDBValue?["name"] {
            print(name)
        }
    })
}

Любая помощь будет отличной, заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 17 января 2019

Похоже, friends является массивом, поэтому проверка для FriendID напрямую не будет работать. Возможно, попробуйте получить доступ к snapshot.value как NSArray, затем переберите элементы в snapshot.value и проверьте, имеет ли какой-либо из них идентификатор FriendID, который соответствует.

0 голосов
/ 18 января 2019

Если целью узла друзей является сохранение идентификаторов друзей, вам лучше хранить каждый идентификатор друга в качестве ключа прямо под узлом друзей. Структура будет выглядеть так:

 friends
    + qvhN5UMnbOWvfhhN4RAHtwjLuwG2: 0
    + w3f7yLMdArUrnKLWR1nyE7ko1ds1: 0
    + otherFrienID: 0

Теперь вы можете легко просматривать свой словарь, как показано ниже (не проверено):

let profileDB = Database.database().reference().child("Profiles")
profileDB.child(userID!).child("friends").observeSingleEvent(of: .value, with: {
 (snapshot) in    

  let dbValue = snapshot.value as? NSDictionary
  var friendsIds = [String]()

  for (key, value) in dbValue {
   friendsIds.append(key)
  //Here you can query firebase for the name corresponding to the friendId
  }
})

Затем вы можете запросить у Firebase имя, соответствующее каждому friendsIds.

Но, что еще лучше, вы могли бы сохранить friendsIds вместе с соответствующими именами, чтобы вам не приходилось делать дополнительные запросы. В этом случае исходная структура будет выглядеть так:

 friends
    + qvhN5UMnbOWvfhhN4RAHtwjLuwG2: "John Doe"
    + w3f7yLMdArUrnKLWR1nyE7ko1ds1: "Steve Jobs"
    + otherFrienID: "Peter Pan"

Избыточность данных в целях упрощения доступа к данным не является преступлением в Firebase, это называется денормализацией и является частью передовой практики.

Тогда вот как вы могли бы выбрать имя своих друзей в одном запросе:

let profileDB = Database.database().reference().child("Profiles")
profileDB.child(userID!).child("friends").observeSingleEvent(of: .value, with: {
 (snapshot) in    

  let dbValue = snapshot.value as? NSDictionary
  var friendsNames = [String]()

  for (key, value) in dbValue {
   friendsNames.append(value)
  //No additional query here
  }
})
0 голосов
/ 17 января 2019

Похоже, это должно работать. Похоже, вы хорошо понимаете структуру дерева ключей / значений firebase. Если ссылка на базу данных верна, вы сможете проверить каждого ребенка по его ключу, чтобы в итоге получить ваше значение.

Я бы подтвердил, что все ваши ключи верны.

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