在Android Kotlin中从Firebase实时数据库读取数据时出现问题

时间:2020-04-16 12:22:33

标签: android firebase kotlin firebase-realtime-database

我目前正在使用Android的Kotlin进行培训,并且每次尝试访问Firebase数据库中的数据时都会遇到问题。这是数据库中的数据:

Database image

之后,在将应用程序与Firebase链接后,我刚刚创建了一个带有所有必需导入的主活动,但是不幸的是,每当我执行该应用程序并按下按钮时,都不会发生任何事情。

private lateinit var userReference : DatabaseReference
lateinit var textView : TextView
lateinit var button : Button


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    textView = findViewById(R.id.test)
    button = findViewById(R.id.test2)
    button.setOnClickListener(object : View.OnClickListener{
        override fun onClick(v: View?) {
            userReference = FirebaseDatabase.getInstance().getReference("Users")
            Log.d("IPP", "Im here now...")

            userReference.addValueEventListener(object : ValueEventListener {
                override fun onCancelled(p0: DatabaseError) {
                    Log.d("ipp", p0.message)
                }

                override fun onDataChange(p0: DataSnapshot) {
                    Log.d("Ipp", "Im in the onDataChange")
                    for (childDataSnapshot in p0.children) {
                        Log.d("Ipp",childDataSnapshot.key) }
                }

            })
        }

    })
}

该日志什么时候都没有出现,而且确实很烦人,因为我在整个文档中进行搜索,据我所知,这就是我应该做的所有事情(我还检查了数据库中的规则,并读取/始终为true)。

编辑:我忘了提及,执行该命令时出现的唯一日志是“我现在在这里...”,这是单击有效按钮后的日志。

编辑2:数据库中的规则已设置为允许仅出于测试目的而对所有人进行读写。 Rules in database

3 个答案:

答案 0 :(得分:0)

enter image description here

@ peter-haddad 彼得是对的,但我会解释您是否需要它,或者某人每天都会找到该解决方案 这是数据库Firebase的默认规则,将其设置为false,以防止未经授权的用户访问您的数据库,因此,现在将其读写状态都更改为true,但是在发布版本上工作时,请将其设置为false并为用户登录或注册

答案 1 :(得分:0)

逻辑上有问题,每次按下按钮时,都会得到相同的实例,将DatabaseReference的初始化移到按钮外,还将监听器移到外部,因为它们正在按钮内进行监听

  userReference = FirebaseDatabase.getInstance().getReference("Users")
 button.setOnClickListener(object : View.OnClickListener{
        override fun onClick(v: View?) {

            Log.d("IPP", "Im here now...")


        }

    })

userReference.addValueEventListener(object : ValueEventListener {
                override fun onCancelled(p0: DatabaseError) {
                    Log.d("ipp", p0.message)
                }

                override fun onDataChange(p0: DataSnapshot) {
                    Log.d("Ipp", "Im in the onDataChange")
                    for (childDataSnapshot in p0.children) {
                        Log.d("Ipp",childDataSnapshot.key) }
                }

            })

现在,每次在“用户”引用中添加值时,您的addValueEventListener都会触发,您可以通过单击按钮来测试“用户”中的此设置值

答案 2 :(得分:0)

private lateinit var userReference : DatabaseReference
lateinit var textView : TextView
lateinit var button : Button


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    textView = findViewById(R.id.test)
    button = findViewById(R.id.test2)
    button.setOnClickListener(object : View.OnClickListener{
        override fun onClick(v: View?) {
            userReference = FirebaseDatabase.getInstance().getReference("Users").getReference("0") <-------- add this
            Log.d("IPP", "Im here now...")

            userReference.addValueEventListener(object : ValueEventListener {
                override fun onCancelled(p0: DatabaseError) {
                    Log.d("ipp", p0.message)
                }

                override fun onDataChange(p0: DataSnapshot) {
                    Log.d("Ipp", "Im in the onDataChange")
                    for (childDataSnapshot in p0.children) {
                        Log.d("Ipp",childDataSnapshot.key) }
                }

            })
        }

    })
}

添加.getReference(“ 0”)