簡體   English   中英

創建用戶之前檢查Firebase上是否存在數據

[英]Checking if data exists on Firebase before creating User

我有一個小的用戶登錄表單,新用戶必須在其中添加他的用戶名,密碼和昵稱(因為基本的Firebase身份驗證僅接受電子郵件作為用戶名,對嗎?)。

這是我在Firebase上創建的用於接收昵稱的用戶結構 在此處輸入圖片說明

密鑰基於用戶名,並且有2個子代:昵稱和用戶名。

在嘗試使用Firebase中的auth方法創建用戶之前,我先查詢一下昵稱是否已經存在。 如果是,它不會創建用戶並引發警報。 如果昵稱不存在,它將創建用戶,然后從上圖將昵稱添加到用戶結構。

我花了一些時間思考和更改代碼(代碼跳了'observeSingleEventOfType'並執行了createUser,然后再檢查昵稱是否存在),我認為一個好主意是獲取createUser代碼並將其直接添加到昵稱查詢上的observeSingleEventOfType,作為“ if snapshot.exists()”的“ else” ...

它似乎正在工作,但是我不知道這是否是執行它的“正確”方式...

還有另一種方法(更好的方法)嗎?

方法如下。 謝謝!

 func createUser(username: String, password: String, nickname: String){

    var userCreated = false
    var errorCode = 0

    users.queryOrderedByChild("Nickname").queryEqualToValue(nickname).observeSingleEventOfType(.Value, withBlock: { (snapshot) in
        if snapshot.exists() {
            errorCode = 3
            self.delegate?.didReceiveResponseFromFirebaseCreateUser!(userCreated, errorCode: errorCode)
        }
        else{
            self.ref.createUser(username, password: password, withCompletionBlock: { (error) in
                if error != nil {
                    print (error.description)

                    if error.description.rangeOfString("EMAIL_TAKEN") != nil {
                        errorCode = 1
                    }
                    else if error.description.rangeOfString("INVALID_EMAIL") != nil {
                        errorCode = 2
                    }

                }
                else{
                    userCreated = true
                    let newUser = User(username: username, nickname: nickname)

                    let newUserRef = self.users.childByAppendingPath(username.stringByReplacingOccurrencesOfString(".", withString: "-"))
                    newUserRef.setValue(newUser.toAnyObject())

                }

                self.delegate?.didReceiveResponseFromFirebaseCreateUser!(userCreated, errorCode: errorCode)

            })
        }


    })
}

在構建我的上一個Firebase應用程序時,我遇到了同樣的問題。 我用來解決該問題的方法是創建一個從用戶名到用戶ID的附加映射。 所以我的結構看起來像這樣(uid是Firebase身份驗證的用戶ID):

users: {
   accounts: {
      uid1: { 
          username: frank,
          ...
      },
      uid2: { 
          username: monique,
          ...
      }
      ...
   },
   username_to_uid: {
      frank: uid1,
      monique: uid2,
      ...
   }
}

這有兩點:

  1. 用戶嘗試注冊時,您可以使用“ username_to_uid”映射首先檢查其提供的用戶名是否已存在
  2. 您也可以使用用戶名和密碼登錄用戶。 默認情況下,您可以使用Firebase身份驗證以及電子郵件和密碼登錄用戶。 這里的想法是,對於給定的用戶名,您可以使用“ username_to_uid”映射輕松檢索與此用戶名關聯的uid,因此您可以使用用戶名和密碼登錄用戶。

請注意我與Firebase Event Observer的同步性問題:

昨天,我認為它正在運行,在調用segue打開另一個viewController時遇到問題(在Observer仍在運行但沒有結果的情況下調用新視圖,並且應用程序崩潰,因為未聲明使用委托方法)其他視圖)...

作為解決方案,我擺脫了所有委托,並使用完成處理程序重新編碼了方法……現在一切正常!

哦,@ pkacprzak:我進行了更改,並開始使用此“橋結構”存儲昵稱和uid之間的關系。 伙計,現在踢了! 非常感謝你!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM