Чтение из базы данных Firebase Realtime, где ссылка = UID пользователя - PullRequest
0 голосов
/ 10 апреля 2020

Я создаю нового пользователя с аутентификацией и устанавливаю ключ пользователя в базе данных как UID пользователя.

private fun writeNewUser(name: String, email: String?) {
        val user = User(name, email)
        mDatabase.child("Users").child(mAuth.currentUser!!.uid).setValue(user)
}



Это работает нормально и дает следующий результат: Authentication + Write Database Result

Я сейчас пытаюсь войти в систему и прочитать информацию об этом пользователе.

Я пытаюсь установить UID в качестве ссылки на базу данных (после успешной регистрации in).
* Мой процесс входа в систему работает.

Я получаю сообщение об ошибке MainActivity, в котором я пытаюсь отобразить данные:

Ошибка : Ни одна из следующих функций не может быть вызвана с предоставленными аргументами:

Строка : ключ? .Let {getValue (mAuth.uid)}

Вот мой код MainActivity, в котором я пытаюсь читать и отображать данные.

class MainActivity : AppCompatActivity() {

    private lateinit var mUser: User
    private lateinit var mAuth : FirebaseAuth
    private lateinit var mDatabase: DatabaseReference

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        mAuth = FirebaseAuth.getInstance()
        mDatabase = FirebaseDatabase.getInstance().reference

        fun currentUserReference(): DatabaseReference =
            mDatabase.child("users").child(mAuth.currentUser!!.uid)

        currentUserReference().addListenerForSingleValueEvent(
            ValueListenerAdapter{
                mUser = it.asUser()!!
                tv_main_name.setText(mUser.name)
                tv_main_email.setText(mUser.email)
            }
        )

    }

    fun DataSnapshot.asUser(): User? =
        //error on this line ↓
        key?.let { getValue(mAuth.uid) }


}



Редактировать 1

Существующее значениеListenerAdapter.kt


class ValueListenerAdapter(val handler: (DataSnapshot) -> Unit): ValueEventListener {

    private val TAG = "ValueListenerAdapter"

    override fun onDataChange(data: DataSnapshot) {
        handler(data)
    }

    override fun onCancelled(error: DatabaseError) {
        Log.e("onCancelled", TAG, error.toException())
    }
}



Редактировать 2

class MainActivity : AppCompatActivity() {

    private lateinit var mUser: User
    private lateinit var mAuth : FirebaseAuth
    private lateinit var mDatabase: DatabaseReference

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        mAuth = FirebaseAuth.getInstance()
        mDatabase = FirebaseDatabase.getInstance().reference

        mDatabase.child("Users").child(mAuth.currentUser!!.uid)
             .addListenerForSingleValueEvent(object : ValueEventListener {

                    override fun onCancelled(p0: DatabaseError) {
                        TODO("Not yet implemented")
                    }

                    override fun onDataChange(p0: DataSnapshot) {

                        //Declare mUser as chosen DB User

                        tv_main_name.setText(mUser.name)
                        tv_main_email.setText(mUser.email)
                    }
                })
    }
}



Edi т 3

override fun onDataChange(p0: DataSnapshot) {
     if (p0.hasChildren()) {
          //Declare mUser as chosen DB User
          tv_main_name.setText(mUser.name)
          tv_main_email.setText(mUser.email)
          }                        
     }

Ответы [ 2 ]

0 голосов
/ 10 апреля 2020

Рабочий раствор

class MainActivity : AppCompatActivity() {

    private lateinit var mUser: User
    private lateinit var mAuth : FirebaseAuth
    private lateinit var mDatabase: DatabaseReference

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        mAuth = FirebaseAuth.getInstance()
        mDatabase = FirebaseDatabase.getInstance().reference

        mDatabase.child("Users").child(mAuth.currentUser!!.uid)
             .addListenerForSingleValueEvent(object : ValueEventListener {

                    override fun onCancelled(p0: DatabaseError) {
                        TODO("Not yet implemented")
                    }

                    override fun onDataChange(p0: DataSnapshot) {
                        if (p0.hasChildren()) {
                            val user = p0.getValue(User::class.java)
                            tv_main_name.text = user?.name
                            tv_main_email.text = user!!.email
                        }
                    }
                })
    }
}
0 голосов
/ 10 апреля 2020
    mDatabase.child("users").child(mAuth.currentUser!!.uid).addListenerForSingleValueEvent(object : ValueEventListener {
                    override fun onCancelled(p0: DatabaseError) {
                       //handle error
                    }

                    override fun onDataChange(p0: DataSnapshot) {
                        if (p0.hasChildren()) {
//If you have model for your user data object then do it like this.
                                                  val user = p0.getValue(YourModel::class.java)

                    }

                })

Это все, что вам нужно сделать, чтобы получить текущие данные о пользователях, вошедших в систему от пользователей узла

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...