【问题标题】:Kotlin - Firebase Database - Convert DataSnapShot to HashmapKotlin - Firebase 数据库 - 将 DataSnapShot 转换为 Hashmap
【发布时间】:2020-11-17 23:07:04
【问题描述】:

我正在从数据库中检索一个如下所示的节点:

 DataSnapshot { key = appointment, value = {timeAppointment=12:00pm, dateAppointment=12/12/1221, clientUID=Bu4sw8ouUUhDv0Ut1IKqeh8kESg2, caseManagerName=Karla Moreno, userName=Sakura Nakamura, formatAppointment=Zoom} }

此 DataSnapshot 存储在自定义回调中。 但是,我只能将其作为 DataSnapshot 检索。我想检索这些值,并使用 TextView 显示它们。

除了将值硬编码到 HashMap 之外,还有其他方法可以将其转换为 HashMap 吗?

这是我的代码:

 class ViewAppointments : AppCompatActivity() {
 var readAppointment: String? = null

 override fun onCreate(savedInstanceState: Bundle?) {
     super.onCreate(savedInstanceState)
     setContentView(R.layout.activity_view_appointments)

     readData(object : AppointmentCallback {
         override fun onCallback(value: DataSnapshot) {
             //Here readAppointment is of type DataSnapshot
             readAppointment = value.toString()
             Log.d("ZXC", "$readAppointment")
         }
     })
     displayData()
 }

 private fun displayData() {
     // returns null
     Log.d("ZXC", "Display appointment from Database: $readAppointment")

 }

 private fun readData(appointmentCallback: AppointmentCallback) {
     val uid = FirebaseAuth.getInstance().currentUser!!.uid
     val rootRef = FirebaseDatabase.getInstance().reference

     val uidRef = rootRef.child("users").child(uid)
     val valueEventListener = object : ValueEventListener {
         override fun onDataChange(dataSnapshot: DataSnapshot) {
             for (item in dataSnapshot.children) {
                 if (item.key.toString() == "appointment") {
                     //item = DataSnapshot { key = appointment, value = {timeAppointment=12:00pm, dateAppointment=12/12/1221,
                     // clientUID=Bu4sw8ouUUhDv0Ut1IKqeh8kESg2, caseManagerName=Karla Moreno, userName=Sakura Nakamura,
                     // formatAppointment=Zoom} }
                     Log.d("ZXC", "$item")
                     appointmentCallback.onCallback(item)
                 }
             }
         }
         override fun onCancelled(databaseError: DatabaseError) {
         }
     }
     uidRef.addListenerForSingleValueEvent(valueEventListener)
 }

 interface AppointmentCallback {
     fun onCallback(value: DataSnapshot)
 }

}

【问题讨论】:

    标签: android kotlin firebase-realtime-database


    【解决方案1】:

    要获取快照中的值映射,请调用其getValue() method。这实际上可能映射到 Kotlin 中的 value 属性。

    【讨论】:

    • 抱歉,我忘了提到我正在将节点存储到自定义回调中。该节点是我展示的 DataSnapshot。看来,我无法从中检索任何值,因为我正试图在另一个函数中打开它。虽然,我可以看到它的键和值,但我无法检索它们。同样,这在 ValueEventListener 之外。如果我没有充分传达这一点,我深表歉意,我才刚刚开始解决这个问题。 @Frank van Puffelen
    • 不要在评论中描述代码,而是编辑您的问题以包含我们任何人都可以运行以重现问题的最小、完整/独立代码。有关如何执行此操作的更多信息,请参阅how to create a minimal, complete, verifiable example
    • 感谢您的建议。我已经继续,并提供了用于检索节点的代码,以及我如何将它存储在自定义回调中。这是60行代码,但我认为有必要展示它。如果您有时间,请告诉我您是否对如何以允许我调用键来检索值的方式存储节点有任何想法(如果没有,我可以将值硬编码到 HashMap 中,但是如果可以的话,我想避免这种情况。
    • 如我的回答中所说,您不想打电话给value.toString(),而是打电话给value.getValue()。这将为您提供一张地图,然后您可以从中获取值。
    • 你当然是对的,弗兰克!很抱歉,我很难理解在哪里调用 .getValue() 我能够使用它来解决问题,如下所示: val 约会 = item.getValue(Appointment::class.java)非常感谢您的帮助!
    猜你喜欢
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 2019-10-24
    • 2021-09-04
    相关资源
    最近更新 更多