Мне очень трудно заполнить мою карту данными JSON Firebase - PullRequest
0 голосов
/ 24 марта 2019

Я пытаюсь получить данные (широту и долготу) из Firebase и разместить их в качестве маркеров для заполнения моей карты Google.Я использую Kotlin.

jsonFirebaseData

Я пробовал официальную документацию Firebase для чтения данных, а также пробовал:

http://myfirebasemaps.ga/

Также пробовал:

Получить местоположение из Firebase и поставить маркер на API Google Map API для приложения Android

private lateinit var mCompanies: DatabaseReference

вСоздать раздел:

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, "")
}

Ничего не происходит.Приложение не падает, но маркеры не добавляются из моей базы.

РЕДАКТИРОВАТЬ

Я создал приватную функцию:

    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 голосов
/ 24 марта 2019

Вы ничего не получаете, потому что ваша ссылка указывает на корневой узел, а не на узел results. Чтобы справиться с этим, просто измените следующую строку кода:

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

до

mCompanies.child("data").child("results").addListenerForSingleValueEvent(/* ... */)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...