我最近在开发基于位置的简单app时遇到了一个非常奇怪的问题。
基本上,我想要实现的是从LatLng
获取OnMapClickListener
对象,使用Dao将其latitude
和longitude
保存到Room中,然后在其他对象中检索它们(fusedLocationProviderClient
的locationCallback确切地说)。
目标 - 一个简单的房间实体,它具有lat,lng和timestamp作为主键。
@Entity(tableName = "destinations")
data class Destination(
@PrimaryKey var timestamp: Long = 0L,
var lat: Double = -1.0,
var long: Double = -1.0
)
DestinationDao - 访问房间。
@Dao
interface DestinationDao {
// Get the newest destination
@Query("SELECT * FROM destinations WHERE timestamp = (SELECT MAX(timestamp) FROM destinations)")
fun getDestination(): Destination?
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertDestination(destination: Destination)
}
MapsActivity - 我从用户点击获取坐标的地方,并使用Room将它们保存到SQLite中
map.setOnMapClickListener { latLng ->
val destination = Destination(System.nanoTime(), lat = latLng.latitude, long = latLng.longitude)
Log.d(TAG, destination.toString())
AppDatabase.getInstance(this).destinationDao().insertDestination(destination)
Log.d(TAG, AppDatabase.getInstance(this).destinationDao().getDestination().toString())
}
MyLocationListener - 我从Room检索坐标的地方
private val locationCallback = object : LocationCallback() {
override fun onLocationResult(userLocation: LocationResult?) {
val array = FloatArray(1)
val destination = AppDatabase.getInstance(appContext).destinationDao().getDestination()
Log.d(TAG, "Distance: ${array[0]} m\nlat: ${destination!!.lat}, long: ${destination.long}")
}
}
这似乎很简单,但由于未知原因,经度永远不会被保存到房间!为了更好地说明这一点,以下是来自MapsActivity
片段的日志(-1.0是默认值)
// Destination created from `LatLng` object from map click listener
D/MapsActivity: Destination(timestamp=248767407310345, lat=50.1813350498603, long=18.45104455947876)
// Destination retrieved from Room
D/MapsActivity: Destination(timestamp=248767407310345, lat=50.1813350498603, long=-1.0)
我完全不知道为什么会这样。我尝试将Double更改为String然后解析它,尝试减少小数位数,我甚至尝试在Destination
类中更改变量声明的顺序 - 没有任何作用。
如果需要任何其他数据,我会发布它。先感谢您。
可能是这样,因为你称经度变长 - 长! “Long”是Java中的保留字,而不是Kotlin,我知道,但是,如果你试图改变这一行怎么办:
var long: Double = -1.0
至
var longitude: Double = -1.0
我认为你的问题在于longitude
的命名,你把它命名为long
这是一种类型,所以也许你可以尝试将这个名称改成独特的东西。