用JSON Firebase数据填充地图时遇到了非常困难的时间

时间:2019-03-24 09:00:07

标签: android firebase firebase-realtime-database kotlin

我正在尝试从Firebase提取数据(经纬度)并将其作为标记来填充我的Google地图。我正在使用Kotlin。

jsonFirebaseData

我已经尝试过Firebase官方文档来读取数据,并且尝试过:

http://myfirebasemaps.ga/

也尝试过:

Retrieve location from Firebase and put marker on google map api for android application

private lateinit var mCompanies: DatabaseReference

onCreate部分:

mCompanies = FirebaseDatabase.getInstance().reference

onMapReady部分:

        fun loadMarkersFromDB() {
            mCompanies = FirebaseDatabase.getInstance().getReference().child("results")
            mCompanies.addListenerForSingleValueEvent(object : ValueEventListener {

                override fun onDataChange(dataSnapshot: DataSnapshot) {
                    for (s in dataSnapshot.children) {
                        var company = dataSnapshot.getValue(Company::class.java)
                        var location = LatLng(company!!.latitude, company.longitude!!)
                        mMap.addMarker(MarkerOptions().position(location).title(company!!.name).snippet(company!!.city))
                            .setIcon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_YELLOW))
                    }
                }

                override fun onCancelled(databaseError: DatabaseError) {
                    Log.w("MapsActivity", databaseError.toException())
                }
            })
        }

我还有一个数据类:

data class Company(
    var city: String,
    var latitude: Double,
    var longitude: Double,
    var name: String
) {
    constructor() : this("", 0.0, 0.0, "")
}

什么都没发生。应用程序不会崩溃,但是我的Firebase没有添加任何标记。

编辑

我创建了一个私有函数:

    private fun loadMarkersFromDB() {
        mCompanies = FirebaseDatabase.getInstance().reference
        mCompanies.addListenerForSingleValueEvent(object : ValueEventListener {
            override fun onDataChange(dataSnapshot: DataSnapshot) {
                if (dataSnapshot.exists()) {
                    for (s in dataSnapshot.children) {
                        var company = dataSnapshot.getValue(Company::class.java)
                        var location = LatLng(company!!.latitude, company.longitude!!)
                        mMap.addMarker(MarkerOptions().position(location).title(company!!.name).snippet(company!!.city))
                            .setIcon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_YELLOW))
                        Log.d("onDataChange", company.toString())
                    }
                }
            }

            override fun onCancelled(databaseError: DatabaseError) {
                Log.w("MapsActivity", databaseError.toException())
            }
        })
    }

然后,在创建地图后,我在onMapReady中调用该函数。

Log.d("onDataChange", company.toString())

在Logcat上显示此内容:

D/onDataChange: Company(city=, latitude=0.0, longitude=0.0, name=)

当我将其更改为 company !!。city 时,没有任何显示。

1 个答案:

答案 0 :(得分:0)

您什么也没得到,因为您的引用指向根节点而不是results节点。要解决这个问题,只需更改以下代码行:

mCompanies.addListenerForSingleValueEvent(/* ... */)

mCompanies.child("data").child("results").addListenerForSingleValueEvent(/* ... */)