#android #json #postgresql #retrofit2
#Android #json #postgresql #модернизация 2
Вопрос:
Я проверил значение HTTP-ответа моего сервера, значение restaurant_isfav
равно t(rue)
{ "restaurant_average": "9", "restaurant_isfav": "t", "restaurant_id": "2", "restaurant_address": "89 Rue Queen, QC J1M 1J5", "restaurant_genre": "Fast Food", "restaurant_lat": "45.3654632370656", "restaurant_tel": " 18198237007", "restaurant_name": "Tim Hortons", "restaurant_long": "-71.85717677305372" },
Когда дело доходит до моего клиента, это значение становится ложным
Restaurant ( restaurant_id=2, restaurant_name=Tim Hortons, restaurant_address=89 Rue Queen, QC J1M 1J5, restaurant_genre=Fast Food, restaurant_average=9.0, restaurant_tel= 18198237007, restaurant_lat=45.365463, restaurant_long=-71.85718, restaurant_isfav=false )
Я реализовал простой веб-сервер с Java
базой данных Postgresql
Вот код, связанный с: Gradle
implementation 'com.google.code.gson:gson:2.8.7' implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
ViewModel
class HomeViewModel : ViewModel() { private val restaurants: MutableLiveDatalt;Listlt;Restaurantgt;gt; = MutableLiveData() private val request = ServiceBuilder.ServiceBuilder.buildService(EndPointInterface::class.java) private lateinit var call: Calllt;Listlt;Restaurantgt;gt; fun getRestaurant(): LiveDatalt;Listlt;Restaurantgt;gt; { return restaurants } fun setRestaurant(id: Int, daoType: Int) { call = request.getRestaurants(id, daoType) call.enqueue(object : Callbacklt;Listlt;Restaurantgt;gt; { override fun onResponse( call: Calllt;Listlt;Restaurantgt;gt;, response: Responselt;Listlt;Restaurantgt;gt; ) { if (response.isSuccessful) { restaurants.postValue(response.body()) } } override fun onFailure(call: Calllt;Listlt;Restaurantgt;gt;, t: Throwable) { t.stackTrace } }) } }
Restaurant
data class Restaurant ( val restaurant_id: Int, val restaurant_name: String, val restaurant_address: String, val restaurant_genre: String, val restaurant_average: Float, val restaurant_tel: String, val restaurant_lat: Float, val restaurant_long: Float, var restaurant_isfav: Boolean, )
Комментарии:
1. Можете ли вы также поделиться классом данных ресторана?
2. Конечно, обновлено в вопросе
Ответ №1:
Это всегда ложно, потому что ваши данные "restaurant_isfav": "t",
возвращают t
неверное значение и возвращают его как строку, а не логическое значение, ваш код будет работать, если данные похожи "restaurant_isfav": true,
Чтобы решить эту проблему, вы можете преобразовать restaurant_isfav
тип из логического в строковый, а затем проверить, является ли он t
или f
,
Другим решением является перечисление, сопоставляющее t
значение TRUE и f
FALSE
enum class Favourite { @SerializedName("t") TRUE, @SerializedName("f") FALSE, }
А в ресторанном классе у вас будет
var restaurant_isfav: Favourite,
И когда вы проверите , вы напишете restaurant_isfav.TRUE
или restaurant_isfav.FALSE
, но если вы хотите получить логическое значение, вы можете написать его так
enum class Favourite(val boolValue: Boolean) { @SerializedName("t") TRUE(true), @SerializedName("f") FALSE(false), }
И вы можете получить значение bool следующим образом restaurant_isfav.TRUE.boolValue
Не забудьте добавить com.squareup.retrofit2:converter-scalars
в свой проект
Комментарии:
1. Спасибо, я изменил все логические значения на строковые как для базы данных, так и для клиента, это работает идеально.