Как получить имя пользователя на Firebase - PullRequest
0 голосов
/ 12 октября 2019

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

private fun saveDataToFireBase() {

    var currentName : String? = null

    useRef.child(mAuth).addValueEventListener(object : ValueEventListener{
        override fun onDataChange(p0: DataSnapshot) {
            if (p0.exists()){
                currentName = p0.child("username").getValue().toString()
            }
        }

        override fun onCancelled(p0: DatabaseError) {
            TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
        }
    })

    val uuid = UUID.randomUUID().toString()
    val messageText = edt_input.text.toString()

    val ref = FirebaseDatabase.getInstance().getReference("message-group/$uuid")
    val data = ChatModel ( uuid, currentName.toString(), messageText , mAuth, ""  )
    ref.setValue(data)
}

enter image description here

Если в Java мы делаем переменную до onCreate, то:

private fun saveDataToFireBase() {

    useRef.child(mAuth).addValueEventListener(new ValueEventListener() {
        @Override
            public void onDataChange(DataSnapshot dataSnapshot)
            {
                if (dataSnapshot.exists())
                {
                    currentUserName = dataSnapshot.child("name").getValue().toString();
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

1 Ответ

0 голосов
/ 13 октября 2019

Данные загружаются из Firebase асинхронно, так как это может занять некоторое время. Вместо того, чтобы блокировать код во время извлечения данных (что также блокирует использование приложения пользователем), основной код продолжается во время загрузки данных. И затем, когда данные доступны, вызывается ваш onDataChange.

Вы можете легко увидеть это с некоторыми записями:

Log.d("TAG", "Before starting to load data")
useRef.child(mAuth).addValueEventListener(object : ValueEventListener{
    override fun onDataChange(snapshot: DataSnapshot) {
        Log.d("TAG", "Got data")
    }

    override fun onCancelled(error: DatabaseError) {
        throw error.toException()
    }
})
Log.d("TAG", "After starting to load data")

Когда вы запускаете этот код, он печатает:

Перед началом загрузки данных

После начала загрузки данных

Получил данные

Вероятно, это не тот порядок, который вы ожидали,но это прекрасно объясняет результат, который вы получаете. К моменту запуска val data = ChatModel ( uuid, currentName.toString(), messageText , mAuth, "" ) данные еще не были загружены, поэтому currentName не имеет значения.


Решение состоит в том, чтобы поместить весь код, которому нужны данные избазы данных внутри метода onDataChange или для его вызова оттуда.

Так, например:

override fun onDataChange(snapshot: DataSnapshot) {
    val uuid = UUID.randomUUID().toString()
    val messageText = edt_input.text.toString()

    val ref = FirebaseDatabase.getInstance().getReference("message-group/$uuid")
    val data = ChatModel ( uuid, currentName.toString(), messageText , mAuth, ""  )
    ref.setValue(data)
}

См. также:

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