【问题标题】:Map in Firebase onDataChange in Kotlin在 Kotlin 中的 Firebase onDataChange 中映射
【发布时间】:2017-12-02 15:25:59
【问题描述】:

我的代码在 firebase 中计算星星(5 颗星) 我有问题,如果它实时更新它计数不正确

(现在是 Firebase)

  1. = 1
  2. = 2
  3. = 0
  4. = 0
  5. = 0

在更改 firebase [add 1. +=1]

  1. = 3
  2. = 4
  3. = 0
  4. = 0
  5. = 0

但如果我重新启动应用程序,它会变为正常结果:

  1. = 2
  2. = 2
  3. = 0
  4. = 0
  5. = 0

为什么 MutableMap 第二次用新星添加地图?

class FireBaseRealTime {

var listofStarsCounter : ArrayList<Int> = ArrayList<Int>(listOf(0,0,0,0,0))
var mDataBase : DatabaseReference = FirebaseDatabase.getInstance().getReference()
var mDeviceLikesRef = mDataBase.child("service").child("devices").child("sam").child("likes")

fun allAverageLike(text: TextView,star1: TextView,star2: TextView,star3: TextView,star4: TextView,star5: TextView) {
    var count : Int = 0
    var sumAllvalue : Int = 0

    mDeviceLikesRef.addValueEventListener(object : ValueEventListener{
        override fun onCancelled(p0: DatabaseError?) {
            TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
        }

        override fun onDataChange(dataSnapshot: DataSnapshot?) {
            dataSnapshot?.children?.forEach { child : DataSnapshot ->

                val objectMap : MutableMap<String, Any>
                objectMap = child.value as MutableMap<String, Any>

                for(entary in objectMap) {
                    if(entary.key.equals("value")) {
                        when(entary.value.toString()){
                            "1" -> listofStarsCounter.set(0, listofStarsCounter.get(0) + 1)
                            "2" -> listofStarsCounter.set(1, listofStarsCounter.get(1) + 1)
                            "3" -> listofStarsCounter.set(2, listofStarsCounter.get(2) + 1)
                            "4" -> listofStarsCounter.set(3, listofStarsCounter.get(3) + 1)
                            "5" -> listofStarsCounter.set(4, listofStarsCounter.get(4) + 1)
                        }
                        count++
                        sumAllvalue += entary.value.toString().toInt()
                    }
                }
            }
            try {
                text.text = "%.1f".format(sumAllvalue.toDouble() / count.toDouble())

                star1.text = "%.1f".format((100.0/count.toDouble()) * listofStarsCounter.get(0).toDouble())
                star2.text = "%.1f".format((100.0 / count.toDouble()) * listofStarsCounter.get(1).toDouble())
                star3.text = "%.1f".format((100.0 / count.toDouble()) * listofStarsCounter.get(2).toDouble())
                star4.text = "%.1f".format((100.0 / count.toDouble()) * listofStarsCounter.get(3).toDouble())
                star5.text = "%.1f".format((100.0 / count.toDouble()) * listofStarsCounter.get(4).toDouble())
            } catch (e : ArithmeticException) {

            }
        }
    })
}

}

【问题讨论】:

    标签: firebase firebase-realtime-database kotlin


    【解决方案1】:

    使用您的示例,您的 ArrayList 最初看起来像这样:

    [ 1 , 1 , 0 , 0, 0 ]
    

    当您将 1 加到 1 星评级时,您在侦听器中获得的快照实际上包含整个更新后的列表,即:

    [ 2 , 1 , 0 , 0, 0 ]
    

    您得到意外结果的原因是因为您实际上是将这个更新的列表添加到您的原始列表中,这当然会导致:

    [ 3 , 2 , 0 , 0 , 0 ]
    

    重新启动应用程序可以解决此问题,因为您再次从一个全零列表开始,并将侦听器中接收到的数据添加到该列表中。


    因此,要解决您的问题,您只需在获得更新时覆盖列表中的每个值,而不是添加到现有值。您可以通过在运行循环之前将列表重置为全零来做到这一点。

    val objectMap : MutableMap<String, Any>
    objectMap = child.value as MutableMap<String, Any>
    
    listofStarsCounter = arrayListOf(0, 0, 0, 0, 0)
    
    for (entary in objectMap) {
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多