提问者:小点点

从firebase数据库读取数据到类中不起作用


我试图从我的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。

提前致谢


共1个答案

匿名用户

Firebase查询是异步的,不会在调用AddValueEventListener后立即完成。您的代码假设数据库类立即被填充,但它没有。您可以添加一些日志记录,以便自己查看代码实际执行的顺序。

在类的构造函数中使用Firebase并不是特别好的设计。如果您对Google目前推荐的方式感兴趣,那么您可能希望了解MVVM体系结构。这需要更多的工作,但这是在Android应用程序中处理异步编程的正确方法。