如何从 kotlin 中的 firestore 读取映射数据

Posted

技术标签:

【中文标题】如何从 kotlin 中的 firestore 读取映射数据【英文标题】:how to read mapped data from firestore in kotlin 【发布时间】: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 的列表,因为它们有很多还是只有第一个? 【参考方案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"] 。

以上是关于如何从 kotlin 中的 firestore 读取映射数据的主要内容,如果未能解决你的问题,请参考以下文章

作为 Kotlin 中的函数的结果,如何从 Firestore 数据库返回列表?

作为 Kotlin 中的函数的结果,如何从 Firestore 数据库返回列表?

如何使用Kotlin从Firestore中的数组字段中获取数据?

Kotlin - 如何执行 onCompleteListener 从 Firestore 获取数据?

如何使用kotlin滑动删除存储在firestore中的recyclerview项目?

如何在 Kotlin 中将 Firestore 日期/时间戳转换为日期?