2016-12-23 10 views
1

値:子を検索すると、私のデータベースは次のようにソートされた値がありFirebase /スウィフト

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 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) 
    } 
}) 
を返されるケースを扱います、複数の結果が生じる可能性があります。したがって、スナップショットにはそれらの結果のリストが含まれています。結果が1つだけの場合でも、スナップショットには1つの結果のリストが含まれます。

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

にカップルの事

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!) 
} 

我々はuid_0の情報を取得したいと

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

(これは、Firebase 2スウィフト2である)

構造を想定し...これを試してみてくださいノート

'dict'変数に[Str型の辞書が割り当てられていると伝えられています任意のオブジェクト]を選択します。

どのオブジェクトも、どんなオブジェクトでもよい。文字列、別の辞書、int。したがって、オブジェクトが何であってもコードを処理できるようにする必要があります

この場合のスナップショットキーはこのユーザーのスナップショットであり、キーは親ノード(この場合はuid_0)でなければなりません。だから、出力が

[email protected] 
some display name 
uid_0 

EDIT:

はFirebase 4、スウィフト4用に更新し、複数の子供が

+0

これは動作しません。あなたが単一のレコードを持っていればそれはいいです。あなたがuid_0とuid_1を持っていて、あなたが探している電子メールがuid_1にあるなら、あなたはそれをどのように見つけますか?uidは自動的に生成されるので、あなたはそれらを知らないのですが、電子メールを見つけてレコードを返すために子供を検索する必要があります – justdan0227

+0

@ justdan0227うまくいきます!コードがテストされます。しかし、ユースケース*は、質問にあったものとは異なります。 OPは、ノードが見つかるとUIDを取得する方法を尋ねています。私のコードでは、各ノードに慎重なuserNameと電子メールがあると仮定して、そのUID(スナップショット?.key)を取得する方法について説明します。私のコードはそれを行います。ただし、複数の結果が可能な場合、クエリは一致するすべてのノードを含むスナップショットを返します。次に、スナップショットを繰り返して問題のuidを取得します。その例のFrankの答えを参照してください。 – Jay

+0

申し訳ありません@Jay、元の質問は「ユーザー名/電子メールでユーザー辞書を検索した後、辞書からUID値を取得するにはどうすればよいですか?あなたが最初にユーザー名/電子メールに基づいて "レコード"を見つけてからUIDを返さなければならないということです。 – justdan0227

関連する問題