Как извлечь ребенка из Firebase при наличии уникального ключа Kotlin - PullRequest
0 голосов
/ 24 апреля 2020

Я хочу получить указанные c дочерние значения, такие как (номер телефона, имя, фамилия) из базы данных Firebase в реальном времени, но для каждого пользователя существует уникальный ключ

, и это дерево:

firebase tree

Я пробовал это:

    var loginRef = rootRef.child("users").orderByChild("phoneNumber").equalTo(phone).addListenerForSingleValueEvent(
        object : ValueEventListener {
        override fun onDataChange(dataSnapshot: DataSnapshot) {
            // Get data object and use the values to update the UI
            val phoneNumber = dataSnapshot.getValue<User>()!!.phoneNumber
            // ...
            Toast.makeText(applicationContext, "phone number is: $phoneNumber", Toast.LENGTH_LONG).show()

        }

        override fun onCancelled(databaseError: DatabaseError) {
            // Getting Data failed, log a message
            Log.w(TAG, "LoginData:onCancelled", databaseError.toException())
            // ...
            Toast.makeText(applicationContext, "error", Toast.LENGTH_LONG).show()
        }
    })

, и у меня есть простая модель под названием Пользователь для обработки данных (я знаю пароли должен быть хеширован здесь)

@IgnoreExtraProperties
data class User(
    var firstName: String? = "",
    var fatherName: String? = "",
    var familyName: String? = "",
    var phoneNumber: String? = "",
    var password: String? = ""
) {

    @Exclude
    fun toMap(): Map<String, Any?> {
        return mapOf(
            "firstName" to firstName,
            "fatherName" to fatherName,
            "familyName" to familyName,
            "phoneNumber" to phoneNumber,
            "password" to password
        )
    }
}

, но dataSnapshot.getValue<User>()!!.phoneNumber никогда не будет работать, так как первый узел, полученный в этом запросе, является уникальным ключом

, что мне нужно что-то вроде dataSnapshot.child("unique-key/phoneNumber").value для каждого ребенка, которого я хочу использовать, но способ проще и эффективнее, чем .addChildEventListener для каждого узла

Ответы [ 2 ]

0 голосов
/ 25 апреля 2020
var loginRef = rootRef.child("users").orderByChild("phoneNumber").equalTo(phone).addListenerForSingleValueEvent(
        object : ValueEventListener {
        override fun onDataChange(dataSnapshot: DataSnapshot) {
            // retreive all children firstly by foreach
            dataSnapshot.children.forEach { data ->
              val userModel = data.getValue(User::class.java)
              val phoneNumber = userModel!!.phoneNumber
              Toast.makeText(applicationContext, "phone number is: $phoneNumber", 
              Toast.LENGTH_LONG).show()
            }
            // ...


        }

        override fun onCancelled(databaseError: DatabaseError) {
            // Getting Data failed, log a message
            Log.w(TAG, "LoginData:onCancelled", databaseError.toException())
            // ...
            Toast.makeText(applicationContext, "error", 
            Toast.LENGTH_LONG).show()
        }
    })
0 голосов
/ 24 апреля 2020

Давайте сначала дадим несколько заметок с кодом:

Первое, что вам нужно знать, здесь:

dataSnapshot.getValue<User>()!!.phoneNumber

поскольку он может быть нулевым, если phoneNumber не существует и выдаст ошибку.

во-вторых, при условии, что вы выполнили некоторую нулевую обработку, он все равно вернет вам пустую строку, потому что то, что вы отправили в модель, является просто уникальным ключом и, конечно, вы не можете справиться с этой моделью.

Самый простой способ решить эту проблему и получить дочерние элементы полученного узла - использовать для l oop в соответствии с этим решением: { ссылка }

вам нужно сделать так, чтобы l oop помещал каждый элемент в список массивов, попробуйте этот код:

    val userList: MutableList<User?> = ArrayList()
    var loginRef = rootRef.child("users").orderByChild("phoneNumber").equalTo(phone).addListenerForSingleValueEvent(
        object : ValueEventListener {
            override fun onDataChange(dataSnapshot: DataSnapshot) {
                userList.clear()
                for (userSnapshot in dataSnapshot.children) {
                    val user: User? = userSnapshot.getValue(User::class.java)
                    userList.add(user)

                    // Get Data object and use the values to update the UI
                    // ...
                    Toast.makeText(applicationContext, "hi: ${user!!.phoneNumber}", Toast.LENGTH_LONG).show()
                }

            }
            override fun onCancelled(databaseError: DatabaseError) {
                // Getting Data failed, log a message
                Log.w(TAG, "LoginData:onCancelled", databaseError.toException())
                // ...
                Toast.makeText(applicationContext, "error", Toast.LENGTH_LONG).show()
            }
        })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...