Не удается сохранить долготу в базе данных комнат - PullRequest
0 голосов
/ 31 марта 2019

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

По сути, я пытаюсь добиться получения LatLng объекта из OnMapClickListener, сохранения его latitude и longitude в Комнату, используя Dao, и затем извлекая их в некоторый другой объект (точнее, fusedLocationProviderClient `locationCallback).

Код

Пункт назначения - простая сущность комнаты, у которой в качестве первичного ключа указаны широта, долгота и метка времени.

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

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 - ничего не работает.

Если нужны какие-либо дополнительные данные,Я отправлю это.Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 31 марта 2019

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

1 голос
/ 31 марта 2019

Это может быть так, потому что вы назвали переменную долготы - long!Я знаю, "длинное" зарезервированное слово в Java, а не в Котлине, но что, если вы попытаетесь изменить эту строку:

var long: Double = -1.0

на

var longitude: Double = -1.0
...