2016-09-29 4 views
1

特定のメールに一致するユーザーを検索するクエリを作成しようとしています。クエリを実行すると、データベース内のすべての電子メールが取得されます。最終的な目的は、このユーザーを自分のメールで見つけて、InMatchSearchingForUserのキー値を更新することです。これは私のコードです:Firebaseクエリ - 一致するメールを検索する

func fetchUsersSearchingForMatch() { 
    ref = FIRDatabase.database().reference() 
    let user = AppUser() 


    ref.child("users").observe(.childAdded, with: { (snapshot) in 
     if let dictionary = snapshot.value as? [String: AnyObject] { 
      user.userEmail = (snapshot.value as? NSDictionary)?["email"] as? String 
      user.searchingForMatch = ((snapshot.value as? NSDictionary)?["SearchingForMatch"] as? Bool)! 
      print(dictionary) 
      if user.searchingForMatch == true { 
       self.users.append(user) 
       self.foundUser = self.users[0] 
       print("this is your foundUser \(self.foundUser.userEmail)") 
       print("this number of users are searching for a match: \(self.users.count)") 
      } 
     } 
     self.foundUserSearchingForMatch() 
    }) 
} 


func foundUserSearchingForMatch() { 

    if user.inMatch == false { 

     let query = self.ref.child("users").queryOrdered(byChild: "email").queryEqual(toValue: foundUser.userEmail) 
     print("this is the query \(query)") 
    } 
} 

私は正しいユーザーを選んでいることを知るまで、私は更新を行っていません。私がするとき、あなたはどのように値を更新するのですか?クエリの中でそれを行うことはできますか?

JSON TREE:ユーザーが一致するものを見つけたとき

{"Firebase APP": { 
    "RANDOM USER ID": { 
     "USEREMAIL": "[email protected]", 
     "SearchingForMatch": "true", 
     "InMatch": "false" } 
} 

、私はfalsetrueSearchingForMatchからInMatchキーを変更したいです。

私は電子メールまたはfoundUser電子メールを更新しません。 foundUserInMatch、およびSearchingForMatchのキー値を更新したいとします。

私はFBDBからマッチを探して、ユーザーからの電子メールを取得する方法はSearchingForMatchが私のすべてのユーザーにtrueに等しい場合、私はそれが等しいtrueない場合、私は配列に追加した後、最初の取得、チェックするときです要素の電子メール(今はfoundUserです)。メールfoundUserを使用して、そのユーザーのキー値(InMatchSearchingForMatch)を更新したいとします。

+0

だから、私はちょうどInMatchとSearchingForUserキーEメールを更新したくないあなたのJSONツリー – Dravidian

答えて

1

これをお試しください: -

 FIRAuth.auth()?.currentUser?.updateEmail("new_Email", completion: { (Err) in 
     if Err == nil { 

      FIRDatabase.database().reference().child("Users").queryOrdered(byChild: "USEREMAIL").queryEqual(toValue:).observeSingleEvent(of: .value, with: {(Snap) in 

       if let snapDict = Snap.value as? [String:AnyObject]{ 

        for each in snapDict{ 

        let key = each.key 
        let match = each.value["SearchingForMatch"] as! Bool       
      FIRDatabase.database().reference().child("Users/\(key)").updateChildValues(["SearchingForMatch" : "true"], withCompletionBlock: { (err, ref) in 
          if err == nil{ 
           //Task acomplished.... 
          } 
         }) 
        } 
       } 
      }) 
     }else{ 
     //Couldn't update the auth value. 
     } 
    }) 
+0

を与えます。最初の行が電子メールを変更しないでしょうか? – cosmos

+0

はい、メールを更新します... FBDBであなたのメールアドレスを更新したいのであれば、 '' FIRDatabase.database()。reference()。child( "Users")... ' – Dravidian

+0

ok、私は私の電子メールまたはfoundUser電子メールを更新したくない。 foundUser InMatchおよびSearchingForMatchキー値を更新したいとします。私はFBDBからの一致を探しているユーザから、すべてのユーザでSearchingForMatchが真であるかどうかをチェックします。もしそれが配列に追加されたら、最初の要素の電子メール(今はfoundUserです)を取得します。 foundUser電子メールを使用して、そのユーザーのキー値を更新します。 – cosmos

関連する問題