当前位置: 首页 > 知识库问答 >
问题:

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

孔瑾瑜
2023-03-14

我试图从我的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个答案

燕扬
2023-03-14

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

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

 类似资料:
  • 我试图从Firebase数据库中读取数据,我已经到处阅读和查找,但我已经走到了死胡同。 这就是我所做的一切。 依赖项: 实现'com.google.firebase: Firebase存储: 9.2.1' 实现'com。谷歌。firebase:firebase数据库:9.2。1' 实现'com。谷歌。firebase:firebase授权:9.2。1' 实现'com。谷歌。火基:火基核心:9.2。

  • 我已经花了几个小时阅读产品分支中的0和1。请在Firebase数据库有经验的人帮助我:(

  • 因此,我尝试拍摄数据库的快照,并添加带有子项的数组字符串中的项。 我的set和get java文件如下所示 但是,当我的程序到达dataQuery方法并尝试获取和设置名称和成分时,它会崩溃。有人能解释一下我做错了什么,以及是否有更好的方法来使用数据库快照来做到这一点吗? 进程:in.tvac.akshayejh.firebasesearch,PID:24798java.lang.NullPoint

  • 一切正常,但DatabaseReference无法获取数据,这就像是忽略了我的代码运行,就像我的internet无法运行一样,请帮助我,我是这个社区的新手,下面是我的代码和图片。 以前它是工作的,但由于我只是更改了一些代码,使只有currentVersion>=vCode,这样即使数据库中的值是 firebase数据库映像 mainactivity.java manifest.xml 依赖关系

  • 我正在尝试读取我的Flutter应用程序中的firebase实时数据库中的数据,并将其分配给模型类,但是,我在控制台中得到了以下错误。 下面是我到目前为止所做的代码 员工类别 我不知道我做错了什么,请帮我解决这个问题

  • 我遇到的问题是,使用下面显示的以下Firebase规则,经过身份验证的用户可以成功写入数据库,但无法从中读取,因为我在控制台中获得了“拒绝权限”。当我将读取和写入设置为true(公共)时,读取和写入功能都正常工作。我从数据库中读取的代码也显示如下: 规则: 示例数据库: 以下是确切的错误:

  • 我在数据库中有数据:Firebase中的数据库 我想读取所有子项(Belgia、Czechy、Polska…),并将其显示在文本字段中,但单击按钮后(我不会更改数据库中的数据)。按钮分配了以下功能: 在我写代码之前: 不幸的是,当我按下按钮时,什么也没有发生。 我很感激你的帮助问候,马辛

  • 我正在处理需要以这种方式读取 firebase 节点的项目: 假设我在Firebase实时数据库中有一个节点。在该节点中,我有消息。当用户在消息框中输入时,我需要显示消息。但是一次阅读所有消息太耗时了。 我想要的是,一次读取消息并将其显示给用户。当用户按下按钮时,我会读取另一个消息并将其显示给用户。依此类推……会更快更方便。 但是我找不到任何方法让事情像这样工作。我尝试了,但是它读取了节点中的所有