简体   繁体   English

如何从当前用户获取FirebaseDataBase快照?

[英]How to get FirebaseDataBase Snapshot from current user?

private fun getUserInfo() {


val userkey = FirebaseAuth.getInstance().uid ?: ""
val ref = FirebaseDatabase.getInstance().getReference("/users/$userkey")
ref.addListenerForSingleValueEvent(object: ValueEventListener {

    override fun onDataChange(p0: DataSnapshot) {
        val adapter = GroupAdapter<ViewHolder>()

        p0.children.forEach {
            Log.d("getUserInfo", it.toString())
            val user = it.getValue(User::class.java)
            if (user != null) {
                adapter.add(UserItem(user))
            }
        }

        UserInfo_RCView.adapter = adapter
    }

    override fun onCancelled(p0: DatabaseError) {

    }
})
}
}

class UserItem(val user: User): Item<ViewHolder>() {
override fun bind(viewHolder: ViewHolder, position: Int) {
    viewHolder.itemView.UsernameSettings_txt.text = user.username

    Picasso.get().load(user.profileImageUrl).into(viewHolder.itemView.ProfileImage_View)
}

override fun getLayout(): Int {
    return R.layout.userinfo
}
}

I wanted to make a snapshot from my current user like this, every time I put the $userkey in my ref value the app crashes with this error: 我想像这样从当前用户制作快照,每次将$userkey放入ref值时,应用都会因以下错误而崩溃:

2018-11-23 22:04:48.414 3871-3871/my.app E/RecyclerView: No adapter attached; 2018-11-23 22:04:48.414 3871-3871 / my.app E / RecyclerView:未连接适配器; skipping layout 2018-11-23 22:04:49.797 3871-3871/my.app E/AndroidRuntime: FATAL EXCEPTION: main Process: nobrand.ljb.musicshare, PID: 3871 com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type myapp.User 跳过布局2018-11-23 22:04:49.797 3871-3871 / my.app E / AndroidRuntime:致命例外:主进程:nobrand.ljb.musicshare,PID:3871 com.google.firebase.database.DatabaseException:可以t将类型为java.lang.String的对象转换为类型myapp.User

When I didn't put the $userkey in my ref value. 当我没有将$userkey放入我的参考值时。 The app functions as normal put displays all users as expected, but as I said I don't want that. 该应用程序正常运行,可以按预期显示所有用户,但是正如我所说,我不希望那样。 I'll be thankful for every answer and suggestion! 我会很感激每一个答案和建议!

If you directly access the correct child node, the loop in your code is not needed anymore. 如果您直接访问正确的子节点,则不再需要代码中的循环。

This means there are two simple ways to do this: 这意味着有两种简单的方法可以做到这一点:

  1. Query by key 按键查询
  2. Remove the loop 删除循环

I'd recommend removing the loop as there's really no need for it anymore, but wanted to show both options. 我建议删除循环,因为实际上不再需要它了,但是想显示两个选项。

Query by key 按键查询

val ref = FirebaseDatabase.getInstance().getReference("/users")
ref.orderByKey().equalTo(userkey).addListenerForSingleValueEvent(object: ValueEventListener {

    override fun onDataChange(p0: DataSnapshot) {
        val adapter = GroupAdapter<ViewHolder>()

        p0.children.forEach {
            Log.d("getUserInfo", it.toString())
            val user = it.getValue(User::class.java)
            if (user != null) {
                adapter.add(UserItem(user))
            }
        }

        UserInfo_RCView.adapter = adapter
    }

    override fun onCancelled(p0: DatabaseError) {
        throw p0.toException();
    }
})

Remove the loop 删除循环

val ref = FirebaseDatabase.getInstance().getReference("/users/$userkey")
ref.addListenerForSingleValueEvent(object: ValueEventListener {

    override fun onDataChange(p0: DataSnapshot) {
        val adapter = GroupAdapter<ViewHolder>()

        val user = p0.getValue(User::class.java)
        if (user != null) {
            adapter.add(UserItem(user))
        }

        UserInfo_RCView.adapter = adapter
    }

    override fun onCancelled(p0: DatabaseError) {
        throw p0.toException();
    }
})

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM