在我的聊天应用程序 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时出错
下面这行代码:
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
}
}
但是,一旦您的应用程序投入生产,请不要忘记保护数据库。
我想要具有 susure 规则的解决方案