【问题标题】:Firebase retrieving String as LongFirebase 检索字符串为 Long
【发布时间】:2021-04-08 16:09:39
【问题描述】:

为什么 firebase 将我转换为字符串的坐标保存为 Long? 我像这样转换它们:

update("latitude", latitude.toString(), "longitude", longitude.toString())

我可以将它们视为 firebase 中的字符串

但是当我首先使用快照侦听器检索它们时,它们以 Long 形式出现,导致我的应用程序崩溃,然后它们变成字符串。这是日志

2021-04-08 14:05:29.089 21864-21864/com.crynet.overeser D/MYLOG:很长

2021-04-08 14:05:29.503 21864-21864/com.crynet.overser D/MYLOG:很长

2021-04-08 14:05:30.314 21864-21864/com.crynet.overeser D/MYLOG:它是一个字符串

2021-04-08 14:05:36.098 21864-21864/com.crynet.overser D/MYLOG:它是一个字符串

fb.collection("delivery").addSnapshotListener { collection, _ ->
        if(collection != null && !collection.isEmpty){
            map.clear()
            for (doc in collection){
                val lat = doc["latitude"] as String // Crash here
                val long = doc["longitude"] as String
                val trackingLatLng = LatLng(lat.toDouble(), long.toDouble())
                val options = MarkerOptions().position(trackingLatLng)
                map.addMarker(options)
            }
        } else {
            Toast.makeText(this, "Nenhuma entrega está a ser feita de momento", Toast.LENGTH_LONG).show()
            map.clear()
        }
    }

【问题讨论】:

  • 可能包含您用于检索值的代码?
  • 您需要提供显示生成日志语句的代码的代码,并显示如何从 Firebase 检索坐标。显然,firebase 将它们保存为字符串,而您的代码中存在输入问题。所以你标题的问题是不正确的。
  • 对不起,我真的忘记包含代码了。
  • 如果使用特定的DocumentSnapshot.getString() 方法而不是通用的DocumentSnapshot.get() 会发生什么?
  • 另外我不知道为什么你试图将它们存储为字符串,当你阅读它们时看起来你将它们转换为双精度值?

标签: android firebase kotlin


【解决方案1】:

好的,看来问题在于addSnapshotListener 的工作原理。在收听服务器上的更改之前,它首先在本地检查。这就是为什么它在我的情况下触发 2 次。

要解决这个问题,您可以使用snapshot.metadata.isFromCache 检查快照是否来自服务器,或者不要将数据转换为字符串,而是直接将数据保存到另一个变量,然后将其转换为 Double .toDouble()(在我的情况下)您将使用这些数据。

【讨论】:

    猜你喜欢
    • 2017-06-27
    • 2023-03-05
    • 2016-04-06
    • 2020-12-02
    • 2019-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-10
    相关资源
    最近更新 更多