我试图从我的firebase实时数据库中读取所有用户,并将它们存储在一个数据库类中,从数据库中读取用户的操作与预期一样,但是当我试图从类外访问用户时,它返回一个空列表。这是我的数据库类
class Database {
private val database = FirebaseDatabase.getInstance();
var users = mutableListOf<User>()
init {
val valueEventListener = object : ValueEventListener {
override fun onDataChange(data: DataSnapshot) {
if (data.exists()){
for (child in data.children) {
val user = child.getValue(User::class.java)
users.add(user!!)
}
}
}
override fun onCancelled(data: DatabaseError) {
println("Error occurred while reading users data")
}
}
database.getReference("Users").addValueEventListener(valueEventListener)
}
fun writePerson(user:User) {
val users = database.getReference("Users")
users.child(user.firstname).setValue(user)
}
这是我尝试从数据库类访问用户的地方
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val database = Database()
val rafael = User("Rafael","Backx");
rafael.addPhoneNumber("0123456789")
database.writePerson(rafael)
val rafael2 = User("Rafael2","Backx");
rafael2.addPhoneNumber("012345678910")
database.writePerson(rafael2)
val users = database.users;
println(users.size)
for (child in users){
println(child)
}
}
这是我第一次使用kotlin,android studio和Firebase。
提前致谢
Firebase查询是异步的,不会在调用AddValueEventListener
后立即完成。您的代码假设数据库类立即被填充,但它没有。您可以添加一些日志记录,以便自己查看代码实际执行的顺序。
在类的构造函数中使用Firebase并不是特别好的设计。如果您对Google目前推荐的方式感兴趣,那么您可能希望了解MVVM体系结构。这需要更多的工作,但这是在Android应用程序中处理异步编程的正确方法。