【问题标题】:Problem reading data from Firebase Realtime Database in Android Kotlin在 Android Kotlin 中从 Firebase 实时数据库读取数据时出现问题
【发布时间】:2020-04-16 12:22:33
【问题描述】:

我目前正在 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) }
                }

            })
        }

    })
}

日志没有出现任何时候,这真的很烦人,当我搜索文档时,据我所知,这是我应该做的一切(我还检查了数据库中的规则,并阅读/ write 始终为真)。

编辑:我忘了说,执行时出现的唯一日志是“我现在在这里...”,单击正在工作的按钮后的日志。

编辑 2:数据库中的规则设置为现在允许对每个人进行读/写,仅用于测试目的。 Rules in database

【问题讨论】:

  • 你的onDataChange 被触发了吗?
  • 请为您的数据库打印照片
  • 好像没有,这就是我感到惊讶的原因。
  • 你的照片已经在帖子里了,你应该可以从我包含 Ahmed 的链接中看到它
  • 每条日志消息的大小写不同。您也不处理数据为空的情况(检查p0.hasChildren())。我还考虑将事件侦听器变成它自己的变量,就像在 docs 中一样 - 也许垃圾收集器正在发挥作用。

标签: android firebase kotlin firebase-realtime-database


【解决方案1】:

@彼得哈达德 彼得是对的,但我会解释你是否需要它,或者有人会每天找到一个解决方案 这是数据库 firebase 的默认规则,将其设为 false 以防止未经授权的用户访问您的数据库,因此现在将其更改为 true 以进行读取和写入,但在发布版本时请将其设为 false 并为用户进行登录或注册

【讨论】:

  • 这是我审查的第一件事,因为我很奇怪,但我目前的规则设置为 true。
【解决方案2】:

逻辑有问题,每次按下按钮时都会得到相同的实例,将 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 都会触发,您可以通过单击按钮在用户中测试此设置值

【讨论】:

  • 感谢您对加斯顿的评论。我遵循了您提到的方法,但结果不成功。我遇到的问题是,即使这样,数据也没有添加到数据库中:imgur.com/VHq45pa 如果我只想读取一次数据而不是在数据上使用侦听器,应该采取什么方法?
【解决方案3】:
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")

【讨论】:

    猜你喜欢
    • 2018-12-19
    • 1970-01-01
    • 2023-02-23
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 2021-12-30
    • 1970-01-01
    相关资源
    最近更新 更多