簡體   English   中英

Firebase查詢(快速)以確定數據庫中是否已存在用戶名

[英]Firebase query (in swift) to determine if username already exists in database

我對Firebase和iOS的經驗很少,想知道是否可以在Swift中創建查詢以在Firebase的JSON結構中查找特定數據。

用戶在應用程序中創建帳戶時,系統會提示他選擇用戶名。 當用戶在同一屏幕上按下“繼續”按鈕時,我想實時查詢數據庫以確定用戶選擇的用戶名是否已經存在。

我在網絡上閱讀了很多文章,但找不到任何可以實現目標的東西。 到目前為止,我編寫了下面的代碼,該代碼不起作用,但是我無法查明問題的根源(請注意,username.text是用戶輸入所需用戶名並進行驗證的文本字段):

FIRDatabase
    .database()
    .reference()
    .child("username")
    .queryOrderedByValue()
    .queryEqual(toValue: self.username.text!)
    .observeSingleEvent(of: .value, with: {(snap) in

            if snap.exists(){
                // Username unavailable, choose another one
            } else {
                // Username available, OK to keep this username
            }
})

數據庫結構如下:

{
  "users" : {

      USER_1_UID : {
          "account" : {
              "email" : "test@stackoverflow.com",
              "first name" : "myFirstName",
              "last name" : "myLastName",
              "username" : "my.username"
          }
      }

      USER_2_UID : {
          "account" : {
              "email" : "test@stackoverflow.com",
              "first name" : "myFirstName2",
              "last name" : "myLastName2",
              "username" : "my.username2"
          }
      }
  }
}

我願意更改數據庫結構以添加“用戶名”注釋,如下所示,該注釋將包含所有注冊的用戶名(如果可以簡化查詢的話):

{
  "users" : {

      USER_1_UID : {
          "account" : {
              "email" : "test@stackoverflow.com",
              "first name" : "myFirstName",
              "last name" : "myLastName",
              "username" : "my.username"
          }
      }

      USER_2_UID : {
          "account" : {
              "email" : "test@stackoverflow.com",
              "first name" : "myFirstName2",
              "last name" : "myLastName2",
              "username" : "my.username2"
          }
      }
  }

  "listOfUsernames" : {
      USER_1_UID : "my.username"
      USER_2_UID : "my.username2"
  }
}

歡迎您提供任何幫助。 謝謝!

您的代碼非常接近。 三個變化:

Remove queryOrderedByValue

然后,您將用戶信息埋得太深了

  USER_1_UID : {
      "account" : {
          "email" : "test@stackoverflow.com",
          "first name" : "myFirstName",
          "last name" : "myLastName",
          "username" : "my.username"
      }
  }

更改為(刪除不需要的帳戶節點名稱)

  USER_1_UID : {
    "email" : "test@stackoverflow.com",
    "first name" : "myFirstName",
    "last name" : "myLastName",
    "username" : "my.username"
  }

然后您需要告訴Firebase您正在查詢哪個節點

所以改為

let usersRef = rootRef.child("users")
let queryRef = usersRef.queryOrdered(byChild: "username")
                            .queryEqual(toValue: "some user name")
queryRef.observeSingleEvent(of: .value, with: { snapshot in
  print(snapshot) //you need snapshot, or snap or some other var name
})

最后,您不需要listOfUsernames節點,您的users節點也可以正常工作。

暫無
暫無

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

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