【问题标题】:Null Arraylist from Room Database房间数据库中的空数组列表
【发布时间】:2019-12-10 04:12:56
【问题描述】:

我在 Kotlin 中做天气应用程序,在 Activity 中是首先从 Room 获取缓存数据,并在一小时后更新数据的方法。但是在数据库中保存数据可能存在问题。我在 Profiles 中检查了 API 日志,天气列表中没有 null,因此 API 工作正常。 我正在尝试将天气列表保存为 ArrayList,但来自日志的答案仍然为空。我也尝试过 Type Converter,但仍然没有。也许有人会找到我的问题的原因和答案。

编辑:我删除了 ArrayList 上方的 @Embedded(prefix = "weather_") 并且它可以工作。

CurrentWeather(存储 Weather ArrayList):

@Entity(tableName = "current_weather")
data class CurrentWeather(
@Embedded(prefix = "weather_")
val weather: ArrayList<Weather>? = ArrayList(), //here is my problem
@SerializedName("base")
val base: String,
@Embedded(prefix = "clouds_")
val clouds: Clouds,
@SerializedName("cod")
val cod: Int,
@Embedded(prefix = "coord_")
val coord: Coord,
@SerializedName("dt")
val dt: Int,
@SerializedName("id")
val id: Int,
@Embedded(prefix = "main_")
val main: Main,
@SerializedName("name")
val name: String,
@Embedded(prefix = "sys_")
val sys: Sys,
@SerializedName("visibility")
val visibility: Int,
@Embedded(prefix = "wind_")
val wind: Wind

) {
@PrimaryKey(autoGenerate = false)
var idKey: Int = CURRENT_WEATHER_ID
}

天气:

data class Weather(
@SerializedName("description")
val description: String,
@SerializedName("icon")
val icon: String,
@SerializedName("id")
val id: Int,
@SerializedName("main")
val main: String
)

转换器:

class Converters {

@TypeConverter
fun arrayListToJson(value: List<Weather>?): String {
    return  Gson().toJson(value)
}

@TypeConverter
fun jsonToArrayList(value: String): List<Weather> {
    val objects = Gson().fromJson(value, Array<Weather>::class.java) as   Array<Weather>
    val list = objects.toList()
    return list
}

数据库:

@Database(entities = [CurrentWeather::class, Location::class], version = 15, exportSchema = false)
@TypeConverters(Converters::class) //converter initialization
abstract class WeatherDatabase : RoomDatabase() {

【问题讨论】:

  • 您是否考虑过改用Relation
  • 否,但 Relation 与 List 一起工作,而不是与 ArrayList 一起工作。如果我将天气设置为列表,那么我的类型有问题:/
  • 对于它的价值,你不必使用@SerializedName("") 用于与json中的值具有相同名称的任何变量
  • @a_local_nobody 谢谢。
  • 您确定将其保存到数据库时它不为空吗?

标签: android kotlin retrofit android-room


【解决方案1】:

这是修改后的转换器类。它可能会帮助你。

object class Converters {

    val gson = Gson()

    @TypeConverter
    fun arrayListToJson(list: List<Weather>?): String? {
        return if(list == null) null else gson.toJson(list)
    }

    @TypeConverter
    fun jsonToArrayList(jsonData: String?): List<Weather>? {
        return if (jsonData == null) null else gson.fromJson(jsonData, object : TypeToken<List<Weather>?>() {}.type)
    }
}

【讨论】:

  • 你的意思是value而不是jsonToArrayList中的jsonData吗?
  • @beginner992 是的,变量有错误。现在它被纠正了。看看吧。
  • @beginner992 很高兴知道这一点。
  • @SagarChapagain 我正在为我的 TypeConverter 编写与您相同的逻辑,但它不起作用,然后现在我尝试复制您上面的代码,现在它就像一个魅力一样工作?无论如何谢谢!
  • 3 小时找到这个答案并解决了一个问题,另一个问题 TypeConverters() 在 dao_impl 中具有私有访问权限,请提供任何建议!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-20
相关资源
最近更新 更多