【问题标题】:how to read mapped data from firestore in kotlin如何从 kotlin 中的 firestore 读取映射数据
【发布时间】:2022-01-01 17:20:48
【问题描述】:

我正在尝试从 Firestore 读取映射数据。我正在读取数据,但我不知道如何到达地图中的某个键。

this is mapped data

dbSaveAvailableTimes.addSnapshotListener { snapshot, e ->
            if (snapshot != null && snapshot.exists()) {
                val chaplainAvailableTimes = snapshot.data
                if (chaplainAvailableTimes != null) {
                    Log.d("chaplainAvailableTimes", chaplainAvailableTimes.toString())
                }

我在这里读取数据。

D/chaplainAvailableTimes:{1637868400000={patientUid=null, isBooked=false, time=1637868400000}, 1637863200000={patientUid=null, isBooked=false, time=1637863200000}}

我在日志中得到这样的结果。

当我尝试chaplainAvailableTimes["time"] 时,我得到空值。

那么,在那之后我该如何获取时间关键数据呢?我不熟悉 Kotlin 中的地图。提前感谢您的帮助?

【问题讨论】:

  • 请编辑您的问题并将您的数据库结构添加为屏幕截图。
  • 嗨,我添加了截图。如果单击“这是映射数据”,您将看到数据库结构。谢谢
  • 所以为了更好地理解,你想读取每个对象下存在的“时间”的值,对吧?
  • @kadiryapar 你想要这些times 的列表,因为它们有很多还是只有第一个?

标签: android firebase kotlin google-cloud-platform google-cloud-firestore


【解决方案1】:

根据我上一个问题:

所以为了更好地理解,你想读取每个对象下存在的“时间”的值,对吧?

你的最后一个答案:

嗨,是的。谢谢

要从每个对象中获取“时间”的值,请使用以下代码行:

val db = FirebaseFirestore.getInstance()
val availableTimesRef = db.collection("chaplainTimes").document("availableTimes")
availableTimesRef.get().addOnCompleteListener {
    if (it.isSuccessful) {
        val data = it.result.data
        data?.let {
            for ((key, value) in data) {
                val v = value as Map<*, *>
                val time = v["time"]
                Log.d(TAG, "$key -> $time")
            }
        }
    }
}

logcat 中的结果将是:

1637863200000 -> 1637863200000
1637868400000 -> 1637868400000

【讨论】:

    【解决方案2】:

    您可以使用此代码获取times 的列表:

    // This will be a List<String>
    val timeList = snapshot.data.values.map { (it as Map<*, *>)["time"] as String }
    
    • snapshot.data 返回 MutableMap
    • .values 返回地图值的集合 Collection&lt;Any&gt;
    • .map 将每个值转换为 List&lt;String&gt;
    • map 中,我们将每个值转换为通用映射Map&lt;*,*&gt;,获取键time 的值并将其转换为String

    【讨论】:

      【解决方案3】:

      尝试将chaplainAvailableTimes 转换为val theData = chaplainAvailableTimes as? HashMap&lt;*, *&gt;。之后,您将能够对其进行迭代或获取如下数据:

      theData.values.first().get("time") // returns 1637868400000
      

      【讨论】:

      • 你好,我试过了,但它仍然返回 null。此外,没有选项 .first[ ]。你那是什么意思。谢谢
      • 尝试强制转换它(as,没有?)并在此处发布错误消息。如果施法成功,结果应该是地图。 Map 有 .values.first 属性,它返回第一个元素(与 values.[0] 相同)。我已经更新了 map 的代码(之前是数组,抱歉)。
      • 你好,'theData.values.first()' 方法可用,但 'theData.values.first["time"]' 这个方法不可用。 'theData.values.first()' 这个方法返回数组的第一个元素,即 {patientUid=null, isBooked=false, time=1637868400000}。我想在每个对象下达到时间键。感谢您的支持。
      • 我已经更新了代码以获得时间。检查主要答案。
      • 您好,如果您的意思是更新“theData.values.first()["time"]”此代码,则它不起作用。在 first() 方法之后,它不接受 ["time"] 。
      猜你喜欢
      • 1970-01-01
      • 2021-06-07
      • 2022-10-23
      • 2019-07-03
      • 1970-01-01
      • 2020-04-19
      • 2023-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多