我想在数据库中显示用户名, 但是数据库写为空。我认为是因为我的变量没有在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)
}
如果在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) {
}
});
答案 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)
}
另请参阅: