#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 (например), и это сработает.