L. Busekrus
L. Busekrus

Reputation: 412

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:

2018-11-23 22:04:48.414 3871-3871/my.app E/RecyclerView: No adapter attached; 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

When I didn't put the $userkey in my ref value. 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!

Upvotes: 0

Views: 114

Answers (1)

Frank van Puffelen
Frank van Puffelen

Reputation: 598740

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();
    }
})

Upvotes: 1

Related Questions