我正在尝试从Firebase提取数据(经纬度)并将其作为标记来填充我的Google地图。我正在使用Kotlin。
我已经尝试过Firebase官方文档来读取数据,并且尝试过:
也尝试过:
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 时,没有任何显示。
答案 0 :(得分:0)
您什么也没得到,因为您的引用指向根节点而不是results
节点。要解决这个问题,只需更改以下代码行:
mCompanies.addListenerForSingleValueEvent(/* ... */)
到
mCompanies.child("data").child("results").addListenerForSingleValueEvent(/* ... */)