Не удается сохранить долготу в базе данных комнат

#android #kotlin #double #android-room

#Android #kotlin #двойной #android-room

Вопрос:

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

По сути, то, чего я пытаюсь достичь, — это получить LatLng объект из OnMapClickListener , сохранить его latitude и longitude в Room с помощью Dao, а затем извлечь их в каком-либо другом объекте ( fusedLocationProviderClient если быть точным, LocationCallback).

Код

Пункт назначения — простой объект Room, который имеет широту, lng и временную метку в качестве первичного ключа.

 @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 — место, где я получаю координаты по щелчку пользователя и сохраняю их в SQLite с помощью Room

 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]} mnlat: ${destination!!.lat}, long: ${destination.long}")
        }
    }
  

Проблема

Это кажется простым, но по неизвестной причине долгота никогда не сохраняется в Room! Чтобы лучше проиллюстрировать это, вот журналы из этого 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 классе — ничего не работает.

Если потребуются какие-либо дополнительные данные, я опубликую их. Заранее благодарю вас.

Ответ №1:

Возможно, это так, потому что вы назвали свою долготу переменной — long! «Long» — это зарезервированное слово в Java, не в Kotlin, я знаю, но что, если вы попытаетесь изменить эту строку:

 var long: Double = -1.0
  

Для

 var longitude: Double = -1.0
  

Комментарии:

1. Спасибо — теперь работает отлично! Жаль, что я не могу проверить оба 2 ответа как правильные :/

2. Все в порядке, не волнуйся ))) P.S. но я был первым ))))

Ответ №2:

Я думаю, что ваша проблема заключается в именовании longitude , вы называете это long типом, поэтому, возможно, вы можете попробовать изменить это имя на что-то уникальное.

Комментарии:

1. Не могу поверить, что забыл, что «long» — это зарезервированное слово в Java. Думаю, это потому, что я слишком часто использую Kotlin : D спасибо!

2. Я рад, что вы решили свою проблему. Не волнуйся, приятель, мы все иногда теряем концентрацию. Удачного кодирования 🙂

Ответ №3:

«long» — это зарезервированное ключевое слово, поскольку это также тип переменной. У меня была такая же проблема. Измените его на longitude (например), и это сработает.