Firebase getValue作为具有键的HasMap返回,无论我如何要求

时间:2019-04-01 05:35:55

标签: android firebase kotlin

我的一些数据存储在Firebase中,就像在下面的屏幕快照中一样,存储在名为“ votes”的父项下:

enter image description here

我试图仅拉取值(-1),但继续获取整个HashMap。

在这种情况下,键在我的代码中表示为名为inititorId的变量,而postVotesSnapshot表示包含许多子项的父快照,如我所附的屏幕截图所示。

我尝试过:

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

这两个键都导致我整个HashMap崩溃,因为我需要将该值设为Int。

我尝试过:

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

但是那是行不通的。

我不确定问题出在哪里,因为代码在使用我提到的第一个选项之前可以完美地工作,而今天却突然向我抛出错误。

这是完整的侦听器:

 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

            }
        }
    })
}

1 个答案:

答案 0 :(得分:1)

尝试以下操作:

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

假设您有以下数据库:

posts
   VMQPBq6YK3bJ12xIjGeTHsqaJC2 : -1

此处dataSnapshot将位于子posts处,然后您需要附加addListenerForSingleValueEvent并访问子initiatorId。还要假设InitiatorId等于VMQPBq6YK3bJ12xIjGeTHsqaJC2