Tsabary
Tsabary

Reputation: 3948

Firebase getValue returns as a HasMap with the key regardless of how I ask for it

Some of my data is stored in Firebase as like in the screen shot bellow, under a parent called "votes":

enter image description here

I am trying to pull the value only (-1) but keep getting the whole HashMap.

The key in this case is represented in my code as a variable called inititorId and postVotesSnapshot represents the parent snapshot the holds many children as in the screen shot I've attached.

I've tried:

postVotesSnapshot.child(initiatorId).value or postVotesSnapshot.child(initiatorId).getValue(Integer::class.java)

And both got me the whole HashMap with the key causing a crash because I need the value to be an Int.

I've tried:

val valueHash = postVotesSnapshot.child(initiatorId).getValue(HashMap::class.java)
val myValue = valueHash[initiatorId]

But that doesn't work wither.

I'm not sure what has gone wrong as the code worked perfectly before with the first option I've mentioned and today it suddenly throws an error at me.

Here's the complete Listener:

 val refVotes = if (postType == 0) {
        FirebaseDatabase.getInstance().getReference("/questions/$mainPostId/main/votes")
    } else {
        FirebaseDatabase.getInstance().getReference("/questions/$mainPostId/answers/$specificPostId/votes")
    }



    refVotes.addListenerForSingleValueEvent(object : ValueEventListener {
        override fun onCancelled(p0: DatabaseError) {

        }

        override fun onDataChange(postVotesSnapshot: DataSnapshot) {

            setVotesCount(specificPostId, mainPostId, votesView, postType)

            if (postVotesSnapshot.hasChild(initiatorId)) {

                val voteValue = postVotesSnapshot.child(initiatorId).getValue(Integer::class.java) //this line is the problematic one

                //I do stuff

            }
        }
    })
}

Upvotes: 0

Views: 414

Answers (1)

Peter Haddad
Peter Haddad

Reputation: 80914

Try the following:

val ref = firebase.child("posts")
ref.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot?) {
    val id = dataSnapshot.child(initiatorId).getValue(Integer::class.java)
  }
override fun onCancelled(error: FirebaseError?) {
  println(error!!.message)
   }
})

Assuming, you have the following database:

posts
   VMQPBq6YK3bJ12xIjGeTHsqaJC2 : -1

Here the dataSnapshot will be at child posts, then you need to attach the addListenerForSingleValueEvent and access the child initiatorId. Also assuming that initiatorId is equal to VMQPBq6YK3bJ12xIjGeTHsqaJC2

Upvotes: 1

Related Questions