使用事件侦听器从实时 Firebase 数据库中检索代表 RecyclerView 的活动的数据

retrieving data from the real-time Firebase database for my activity representing a RecyclerView using an event listener

提问人:amen ayari 提问时间:11/2/2023 最后编辑:Alex Mamoamen ayari 更新时间:11/3/2023 访问量:34

问:

在我的应用程序 Kotlin for chat 中,当我使用 addValueEventListener() 从我的聊天活动中的用户那里获取数据时,我遇到了一个小问题,我检索了我的 consol firebase 中的所有数据,我的聊天活动它正确地代表了用户的个人资料,但是当我在 RecyclerView 中 siginup 并联系个人资料用户时,我检索了所有用户,当我从菜单中单击注销时,问题一切正常,但我收到这个消息“从数据库到 MainActivity 出错”,来自这个有趣的覆盖乐趣 onCancelled(错误:DatabaseError)

private fun updateUserListFromDatabase() {
    mDbRef.child("user").addValueEventListener(object : ValueEventListener {

        override fun onDataChange(snapshot: DataSnapshot) {
            userList.clear()

            val previousSize = userList.size

            for (postSnapshot in snapshot.children) {
                val currentUser = postSnapshot.getValue(User::class.java)

                if (mAuth.currentUser?.uid != currentUser?.uid) {
                    userList.add(currentUser!!)
                }
            }

            val currentSize = userList.size
            if (previousSize < currentSize) {
                userAdapter.notifyItemRangeInserted(previousSize, currentSize - previousSize)
            } else if (previousSize > currentSize) {
                userAdapter.notifyItemRangeRemoved(currentSize, previousSize - currentSize)
            } else {
                userAdapter.notifyItemRangeChanged(0, currentSize)
            }
        }

        override fun onCancelled(error: DatabaseError) {
            Toast.makeText(
                this@MainActivity,
                "Error to get from database to MainActivity",
                Toast.LENGTH_SHORT
            ).show()
        }
    })
}

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menuInflater.inflate(R.menu.menu, menu)
    return super.onCreateOptionsMenu(menu)
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    if (item.itemId == R.id.logout) {
        mAuth.signOut()
        val intent=Intent(this@MainActivity,LogIn ::class.java)
        finish()
        startActivity(intent)

        return true
    }

    return true
}

我试图从此活动中注销,其中配置文件用户的 RecycleView 没有收到来自覆盖的此消息:fun onCancelled(error: DatabaseError)

从数据库转到 MainActivity 时出错

Android Kotlin Firebase-realtime-database firebase-authentication

评论

1赞 Alex Mamo 11/2/2023
如果您尝试使用消息是什么?Toast.makeText( this@MainActivity, "${error.message}", Toast.LENGTH_SHORT).show()
0赞 amen ayari 11/2/2023
对于响应,我收到此消息“客户端没有权限........”
0赞 Alex Mamo 11/2/2023
您是否设置了适当的安全规则?
0赞 amen ayari 11/3/2023
是 :{ “rules”: { “.read”: “auth != null”, “.write”: “auth != null” } }
0赞 Alex Mamo 11/3/2023
那么,当您尝试在节点内写入数据时,是否经过身份验证?user

答:

0赞 Alex Mamo 11/3/2023 #1

以下代码行:

Toast.makeText( this@MainActivity, "${error.message}", Toast.LENGTH_SHORT).show()

产生以下错误:

客户端无权访问所需数据

因为您使用的是以下规则:

{
   "rules":{
      ".read":"auth != null",
      ".write":"auth != null"
   }
}

当用户未通过身份验证时尝试读取节点下的数据时,将始终抛出上述错误。因此,在尝试从实时数据库中读取某些内容之前,请始终通过检查 FirebaseUser 对象是否为空来确保用户已通过身份验证:user

mAuth.currentUser?.let {
    //Read data from the Realtime Database.
}

因此,请记住,如果用户在 Firebase 中成功通过身份验证,上述规则不会拒绝读取操作。但是,出于测试目的,在开发应用时,可以使用以下规则:

{
   "rules":{
      ".read":true,
      ".write":true
   }
}

但是,不要忘记在应用投入生产后保护数据库。

评论

0赞 amen ayari 11/3/2023
认为我现在这个解决方案之前在我的评论中查看我下载应用程序时的问题不安全
0赞 Alex Mamo 11/3/2023
最后一条规则并不安全,但可以在开发中使用,但不能在生产中使用。在生产环境中,您应实施 Firebase 身份验证,并仅允许经过身份验证的人员读取该节点。
0赞 amen ayari 11/3/2023
但是错误又回来了,安全规则
0赞 Alex Mamo 11/3/2023
是的,当您使用“安全规则”时,除非您的用户在 Firebase 中通过身份验证,否则所有操作都将被拒绝。
0赞 amen ayari 11/4/2023
但是当我使用安全规则时,我会收到这条消息,在这种情况下,当我在Playstore中上传此应用程序时,我想在我的应用程序中停止此消息错误