2016-09-29 49 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樹:

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

當用戶發現一個比賽,我想改變InMatch關鍵trueSearchingForMatchfalse

我不想更新我的電子郵件或foundUser電子郵件。我想更新foundUser,InMatchSearchingForMatch關鍵值。

我從尋找來自FBDB匹配用戶的電子郵件的方式是,當我檢查是否SearchingForMatch在我的所有用戶等於true,如果它不等於true,我將其追加到一個數組,然後拿到第一元素的電子郵件(現在是foundUser)。使用foundUser電子郵件,我想更新該用戶鍵值(InMatchSearchingForMatch)。

+0

給你的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

所以,我不想更新電子郵件只是InMatch和SearchingForUser鍵。第一行不會更改電子郵件嗎? – cosmos

+0

是的,它也會更新電子郵件...但是如果你只是想在FBDB中更新你的電子郵件,只需從FIRDatabase.database()。reference()。child(「Users」)開始......' – Dravidian

+0

好的,我不想更新我的電子郵件或找到的用戶電子郵件。我想更新找到的用戶InMatch和SearchingForMatch鍵值。當我檢查SearchingForMatch在所有用戶中是否等於true時,我收到用戶尋找FBDB匹配的電子郵件,如果它附加到數組,然後獲取第一個元素的電子郵件(現在是foundUser)。使用找到的用戶電子郵件,我想更新該用戶的關鍵值。 – cosmos