如何从 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 你想要这些time
s 的列表,因为它们有很多还是只有第一个?
【参考方案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】:您可以使用此代码获取time
s 的列表:
// This will be a List<String>
val timeList = snapshot.data.values.map (it as Map<*, *>)["time"] as String
snapshot.data
返回 MutableMap.values
返回地图值的集合 Collection<Any>
.map
将每个值转换为 List<String>
在map
中,我们将每个值转换为通用映射Map<*,*>
,获取键time
的值并将其转换为String
【讨论】:
【参考方案3】:尝试将chaplainAvailableTimes
转换为val theData = chaplainAvailableTimes as? HashMap<*, *>
。之后,您将能够对其进行迭代或获取如下数据:
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 获取数据?