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

问题描述 投票:0回答:2

在我的聊天应用程序 Kotlin 中,当我使用 addValueEventListener() 从我的聊天活动中的用户获取数据时,我遇到了一个小问题我检索了我的 consol firebase 中的所有数据以及我的聊天活动,它正确地代表了用户的个人资料但是当我注册并到达 RecyclerView 中的个人资料用户时,我检索所有用户,当我从菜单中单击注销时,一切正常,但我收到此消息“从数据库获取到 MainActivity 时出错”,来自此有趣的覆盖 fun 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 firebase kotlin firebase-realtime-database firebase-authentication
2个回答
0
投票

下面这行代码:

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

产生此错误:

客户端无权访问所需数据

因为您使用以下规则:

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

当用户未经过身份验证时尝试读取

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

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

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

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

但是,一旦您的应用程序投入生产,请不要忘记保护数据库。


0
投票

我想要具有 susure 规则的解决方案

© www.soinside.com 2019 - 2024. All rights reserved.