如何在Firebase上获取用户名

时间:2019-10-12 18:24:32

标签: firebase kotlin firebase-realtime-database

我想在数据库中显示用户名, 但是数据库写为空。我认为是因为我的变量没有在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 :(得分:0)

数据是从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)
}

另请参阅: