在子项中搜索值时如何获取数据库子项或值

How to get database child or value when searching for value inside the child

我正在尝试在我的数据库中搜索用户电子邮件,然后当找到该电子邮件时,将 uid 或父 table(与 uid 相同)作为 val 存储到电子邮件中。在他们那一刻,我想我有在数据库中搜索电子邮件的方法,所以在 if 语句中我需要存储 uid 以备后用。

fun checkUid(layout: View) {
    val email = layout.findViewById<EditText>(ie.wit.savvytutor.R.id.loginEmail).text.toString()
    val userDatabase =
        FirebaseDatabase.getInstance("*db link")
            .getReference(
                "Users"
            )

    val emailCheck = userDatabase.equalTo(email)

    val eventListener: ValueEventListener = object : ValueEventListener {
        override fun onDataChange(dataSnapshot: DataSnapshot) {
            if (!dataSnapshot.exists()) {
                //get The Uid for that user
                
                println("yay")
            }
        }
        override fun onCancelled(databaseError: DatabaseError) {
            println("no!")
        }
    }
    emailCheck.addListenerForSingleValueEvent(eventListener)
}

我的数据库的 json 如下所示:

{
  "email" : "jamiehogan4848@gmail.com",
  "password" : "Test123",
  "profilepic" : "",
  "role" : "Parent",
  "uid" : "-Mz1FR2jJnrBa1Ws-aVU"
}

所以澄清一下,因为我觉得这措辞不当,我需要在数据库中搜索电子邮件 -> 然后获取该电子邮件的 uid 或父父 table 名称 -> 并将其存储为瓦尔。如前所述,我想我已经完成了第一部分!

您在这里缺少 orderBy 子句:

val emailCheck = userDatabase.equalTo(email)

由于要比较 email 属性 的值,因此需要告诉数据库对其进行排序:

val emailCheck = userDatabase.orderByChild("email").equalTo(email)

现在查询将匹配正确的子节点。有关更多信息,另请参阅 ordering and filtering data.

上的文档

然后您可以记录匹配的子节点的键:

override fun onDataChange(dataSnapshot: DataSnapshot) {
    for (snapshot in dataSnapshot.children) {
        println(snapshot.key)
    }
}

有关详细信息,请参阅 listening for value events 上的文档。