2016-12-23 3 views
1

Моя база данных имеет значения, отсортированные так:Поиск по ребенку ценности Firebase/Swift

Users 
    UID 
     Username 
     Email 

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

Я могу найти пользователей с помощью

REF_USERS.queryOrdered(byChild: "displayname").queryEqual(toValue: input).observeSingleEvent(of: .value) { (snapshot: FIRDataSnapshot) in { 
print(snapshot.value) 
} 

с тем, что я получаю весь словарь пользователя, но у меня проблема захвата UID.

snapshot.key дает мне «Пользователи».

Как я могу получить значение UID из словаря после поиска словаря пользователя с их именем пользователя/электронной почтой?

ответ

1

При выполнении запроса к базе данных Firebase, потенциально может быть несколько результатов. Таким образом, снимок содержит список этих результатов. Даже если есть только один результат, моментальный снимок будет содержать список из одного результата.

let query = REF_USERS.queryOrdered(byChild: "displayname").queryEqual(toValue: input) 
query.observeSingleEvent(of: .value) { (snapshot: FIRDataSnapshot) in { 
    for child in snapshot.children { 
     print(child.key) 
    } 
} 

Также смотрите:

1

Попробуйте это ...

Предположим, структура (это Swift 2, Firebase 2)

users 
    uid_0 
    email: "[email protected]" 
    displayName: "some display name" 

, и мы хотим получить информацию uid_0 в

let displayName = "some display name" 

usersRef.queryOrdered(byChild: "displayName").queryEqual(toValue: displayName) 
       .observeSingleEvent(of: .childAdded) { (snapshot: FIRDataSnapshot) in { 

    let dict = snapshot?.value as! [String: AnyObject] 
    let email = dict["email"] 
    let displayName = dict["displayName"] 
    print(email!) 
    print(displayName!) 

    let key = snapshot?.key 
    print(key!) 
} 

несколько шагов примечание

Переменная «dict» сообщает, что ей присваивается словарь типа [Str ing: Anyobject].

Любой объект может быть любым объектом. Строка, другой словарь, int. Поэтому вам необходимо убедиться, что код может обрабатывать все, что есть у объекта

Ключ моментального снимка в этом случае является снимком этого пользователя, а ключ должен быть родительским узлом, который в этом случае является uid_0. Таким образом, выход

[email protected] 
some display name 
uid_0 

EDIT:

Обновлены для Firebase 4, Swift 4 и обрабатывают случай, когда несколько детей возвращаются

let usersRef = self.ref.child("users") 

let input = "some display name" 
let query = usersRef.queryOrdered(byChild: "displayName").queryEqual(toValue: input) 
query.observeSingleEvent(of: .value, with: { snapshot in 
    for child in snapshot.children { 
     let snap = child as! DataSnapshot 
     let dict = snap.value as! [String: Any] 
     let email = dict["email"] as! String 
     let displayName = dict["displayName"] as! String 
     print(email) 
     print(displayName) 

     let key = snapshot.key 
     print(key) 
    } 
}) 
+0

Это не работает. Это нормально, если у вас есть одна запись. Как бы вы его нашли, если у вас были uid_0 и uid_1, а адрес электронной почты, который вы ищете, находится в uid_1.Uid автоматически генерируются, и поэтому вы их не знаете, но нужно искать детей, чтобы найти электронное письмо и вернуть запись. – justdan0227

+0

@ justdan0227 Это действительно работает! Код проверен. Тем не менее, вы используете * случай, который отличается от того, что было в вопросе. OP спрашивает, как получить UID, как только узел будет найден, и мой код обращается к тому, как получить этот UID (который является снимком? .key), предполагая, что у каждого узла есть скрытое имя пользователя и адрес электронной почты. Мой код делает это. Однако, если есть несколько возможных результатов, запрос возвращает Snapshot, который содержит все соответствующие узлы. Затем вы должны перебрать снимок, чтобы получить информацию об этом, - см. Ответ Фрэнка для этого примера. – Jay

+0

Извините @ Джей, я думал, что исходный вопрос: «Как я могу получить значение UID из словаря после поиска словаря пользователя с их именем пользователя/электронной почтой?» Это означает, что вам нужно сначала найти «запись» на основе имени пользователя/электронной почты, а затем вернуть UID. – justdan0227

Смежные вопросы