【发布时间】:2019-03-31 00:41:46
【问题描述】:
我最近在开发基于位置的简单应用程序时遇到了一个非常奇怪的问题。
基本上,我想要实现的是从OnMapClickListener 获取LatLng 对象,使用Dao 将其latitude 和longitude 保存到Room 中,然后在其他对象中检索它们(fusedLocationProviderClient ` s locationCallback 准确)。
代码
Destination - 一个简单的 Room Entity,以 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 - 访问 Room。
@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}")
}
}
问题
看起来很简单,但不知为何,经度永远不会保存到 Room!为了更好地说明这一点,这里是来自 MapsActivitysn-p 的日志(-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 类中变量声明的顺序 - 没有任何效果。
如果需要任何其他数据,我会发布。 提前谢谢你。
【问题讨论】:
标签: android kotlin double android-room