0

私は個々のユーザノードを持つデータベースをFirebaseに持っています。各ユーザのノードには、それらに関連するデータがあり、プライベートになります。それに加えて、私は登録された電子メールのコレクションであるノードを作成したい。その理由は、ユーザがサインインVC上にいて、ユーザが電子メールを入力したときです。電子メールがすでに登録されている場合、画像ビューは緑色に変わります。ただし、電子メールがデータベースにない場合(または電子メールアドレス形式と一致しない場合)、イメージは赤色になります。textfield.textとfirebaseの文字列を比較するswift

以前の質問に対する以前の回答は、私が '。'を変更する必要があることを示しています。電子メールアドレスの '、'に。 @ gmail.comはgmailとして保存されます。

私はそれを持っています。

FIRAuth.auth()?.createUser(withEmail: email, password: password, completion: { (user, error) in 

    if error == nil { 

     let email = firstContainerTextField.text ?? "" 

     let newString = email.replacingOccurrences(of: ".", with: ",", options: .literal, range: nil) 

     self.ref.child("users").child("allUsers").child(newString).setValue(true) 

     self.ref.child("users").child((user?.uid)!).setValue(["Email": email]) 

     FIRAuth.auth()!.signIn(withEmail: email, 
          password: password) 

    } else { 
     //registration failure 
    } 

これは、新規ユーザーVC(部分)のコードです。

だから、「ユーザー」と「ALLUSERS」と言うのノードがFirebaseコンソール上で次のようになります

users 
    allUsers 
     [email protected],com: true 
     [email protected],com: true 

「真」の部分は、ちょうどので、私は、データベースへのボブ@ボブ、COMを得ることができました。 ..真の部分は何のためにも使われることはありません。

私は正直に何をすべきかを把握することはできませんVCにログオン

は前の回答は

hasChildren() 

を使用するように言ったと私はそれを使用し、その で何をすべきかをGoogleで検索し、私が試しましたこの

ref.child("users").child("allUsers").queryEqual(toValue: newString) 
    .observe(.value, with: { snapshot in 

if snapshot.hasChildren() { 

    for child in snapshot.children.allObjects as! [FIRDataSnapshot] { 
    .... 


} 



    }); 

のようなものを使用してしかし、私はちょうどそれをどこに行くように見えることはできません。

textfield.text ==ファイヤーベースに既に格納されている電子メールかどうかを簡単に確認するにはどうすればよいですか?

答えて

1

キーとしてメールアドレスを使用しないでください(私は「」比較するときに「」に変換しました)。電子メールアドレスは動的で変更される可能性があります(ユーザーが変更したい場合など)。もしそうであれば、その電子メールを直接使用したすべてのノードが削除され再作成されるため、手元に手間がかかります。

ベストプラクティスは、キーのデータとキーのデータの関連付けを解除することです。

はここで、あなたは単にあなたが探している電子メールのメールノードを照会

emails 
    -Yiaisjpa90is 
    email: "[email protected]" 
    -Yijs9a9js09a 
    email: "[email protected]" 

を使用し、それが存在する場合はそれに応じて処理するための構造です。

そして、いくつかのコード、それはもう少しSwiftyは、私はあなたがそれを書いたように、コードを持っていると

if snapshot.exists() { 
    print("found it") 
} else { 
    print("no email found") 
} 
+0

を使用することです完全にするため

emailsRef.queryOrdered(byChild: "email").queryEqual(toValue: "[email protected]") .observe(.value, with: { snapshot in if snapshot.value is NSNull { print("the snapshot was null, no email found") } else { print("email was found, YIPEE") } }) 

それは実際に何かをされた後のために、しかし、それはデータベースで持っていても「電子メールが見つかりません」というメッセージだけを出力します – RubberDucky4444

+0

@ RubberDucky4444あなたのFirebase構造が私が投稿したものと同一で、コードが同じであればコピーして貼り付ける私のプロジェクト。あなたのemailsRef = rootRef.child( "emails")も確認してください。 – Jay

+0

電子メールは私が比較しようとしているものなので、私が変更したのは 'toValue: "[email protected]")' toValue:email 'です。 – RubberDucky4444