【问题标题】:Can't save longitude in Room database无法在房间数据库中保存经度
【发布时间】:2019-03-31 00:41:46
【问题描述】:

我最近在开发基于位置的简单应用程序时遇到了一个非常奇怪的问题。

基本上,我想要实现的是从OnMapClickListener 获取LatLng 对象,使用Dao 将其latitudelongitude 保存到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


    【解决方案1】:

    可能是这样,因为您称您为经度变量 - long! “Long”在 Java 中是保留字,在 Kotlin 中不是,我知道,但是,如果您尝试更改此行会怎样:

    var long: Double = -1.0
    

    var longitude: Double = -1.0
    

    【讨论】:

    • 谢谢 - 现在完美运行!很遗憾我不能同时检查两个答案是否正确:/
    • 没关系,别担心)))但我是第一个))))
    【解决方案2】:

    我认为您的问题在于 longitude 的命名,您将其命名为 long 这是一种类型,所以也许您可以尝试将该名称更改为独特的名称。

    【讨论】:

    • 我不敢相信我忘记了“long”是 Java 中的保留字。我想这是因为我使用 Kotlin 太多了 :D 谢谢!
    • 我很高兴你解决了你的问题。别担心,伙计,我们有时都会注意力不集中。快乐编码:)
    【解决方案3】:

    "long" 是保留关键字,因为它也是变量类型。我有同样的问题。将其更改为经度(例如),它将起作用。

    【讨论】:

      猜你喜欢
      • 2021-01-22
      • 2021-10-22
      • 2019-11-21
      • 2021-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多