【问题标题】:Firebase - Check if Username is taken failingFirebase - 检查用户名是否被采用失败
【发布时间】:2017-04-24 04:27:00
【问题描述】:

我正在尝试检查在我的应用中输入的用户名是否与我的 Firebase 数据库中的任何用户名匹配,如果是,请显示标签并禁用继续搜索/按钮。

相反,我得到一个持续的错误:

  signal SIGABRT (lldb) // for app delegate

这是我的代码: @IBAction func checkUsernameEntered(_ sender: UITextField) {

    let ref = FIRDatabase.database().reference(fromURL: "DATABASE_URL")

    ref.child("users")

        .queryOrdered(byChild: "kid/username")

        .queryEqual(toValue: chooseUsernameTextField.text)

        .observeSingleEvent(of: .value, with: { snapshot in
            if !snapshot.exists(){

                print("The username entered has not been previously registered. Tap 'Next' to proceed.")
                self.bottomNextButtonThree.isEnabled = true
                UIView.animate(withDuration: 0.6, delay: 0, options: .curveEaseOut, animations: { self.uhOhWarningLabel.alpha = 0 }, completion: nil)

            }

            else

            {

                print("The entered username has been previously registered. Re-enter to proceed.")
                self.bottomNextButtonThree.isEnabled = false
                UIView.animate(withDuration: 0.6, delay: 0, options: .curveEaseOut, animations: { self.uhOhWarningLabel.alpha = 1.0 }, completion: nil)
            }

        })

这是我在 firebase 上的数据库结构

image of database structure

感谢任何帮助

【问题讨论】:

  • 我确定您是否可以使用 queryOrdered 中的斜杠进行这样的查询。试试ref.child("users/kid").queryOrdered(byChild: "username").queryEqual(toValue: chooseUsernameTextField.text)
  • 我以不同的方式查询它,但我仍然从 xcode 收到错误:( 在 appDelegate 的 sigABRT 上
  • 很奇怪。你确定是因为查询?如果你删除它,一切都好吗?
  • 您在何处/何时调用此函数?确保在尝试访问 FIRDatabase.database().reference 之前已在 AppDelegate 中调用 FIRApp.configure()

标签: ios swift firebase swift3 firebase-realtime-database


【解决方案1】:

这就是问题所在

let ref = FIRDatabase.database().reference(fromURL: "DATABASE_URL")

所以改为这样做(只是一个粗略的例子)

class ViewController: UIViewController {

    var ref: FIRDatabaseReference!

    override func viewDidLoad() {
        super.viewDidLoad()
        ref = FIRDatabase.database().reference()

        ref.child("test_key").setValue("test_value")
    }
}

Firebase 知道它是在 DATABASE_URL 条目的 GoogleService-Info.plist 中定义的应用路径。

这是您在控制台中创建新应用时 Firebase 网站创建的文件。

【讨论】:

  • 嗨,这可行,但现在我面临的问题是它无法将用户名识别为重复项,即使使用匹配的字符串也是如此。我的代码中的查询是否有错误?我怀疑是if !snapshot.exists()
  • @J.G.Homework 那么看起来你正在做什么测试用户注册之前是否存在用户名,如果它存在告诉他们。如果这是正确的,我建议让 Firebase 为您完成这项工作。只需调用 createUserWithEmail:email:password:completion: 并且如果用户名存在,则会在完成处理程序 (FIRAuthErrorCodeEmailAlreadyInUse ) 中引发错误,您可以从那里处理它。这行得通吗?
  • 如果所有其他方法都失败了,我会使用它,但实际上,我正在尝试合并一个类似于 snapchat 的注册流程,用户一次输入他们的数据一个 VC,所有数据都被传递直到您最终到达确认页面并将数据传递给 Firebase。
  • @J.G.Homework 是的 - 完全理解。我们也沿着这条路走,但是当 Firebase 做出更改时,一旦您创建了用户,它就会登录并注销当前用户,我们决定保持简单并在一个视图中。
猜你喜欢
  • 1970-01-01
  • 2017-03-07
  • 2017-07-25
  • 2016-07-26
  • 2012-12-26
  • 2021-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多