ошибка: не удается понять, как сохранить это поле в базе данных. Вы можете рассмотреть возможность добавления конвертера типов для него - PullRequest
0 голосов
/ 09 января 2020

Мой класс данных, который будет использоваться как Entity, выглядит следующим образом:

@Entity(tableName = "weather_response")
data class CurrentWeatherResponse(
    @PrimaryKey(autoGenerate = false) var id_count: Int = 0,
    @Embedded(prefix = "coord_") val coord: Coord,
    @Embedded(prefix = "details_") @TypeConverters(value = [(DetailTypeConverters::class)]) @SerializedName("weather") val details: List<Details>,
    val base: String,
    @Embedded(prefix = "main_") val main: Main,
    val visibility: Int,
    @Embedded(prefix = "wind_") val wind: Wind,
    val dt: Long,
    @Embedded(prefix = "sys_") val sys: Sys,
    val timezone: Int,
    val name: String,
    val cod: Int
)

Мой объект подробностей - это список пользовательских классов с именем Details, который содержит:

@Entity(tableName = "details")
data class Details(
    val id: Int,
    val main: String,
    val description: String,
    val icon: String
) {
    @PrimaryKey(autoGenerate = false) var id_count = 0
}

В этом списке будет только один элемент. Как упоминалось выше в классе данных, я также указал класс TypeConverter для этого конкретного поля в сущности. Его определение приведено ниже:

class DetailTypeConverters: Serializable {
    companion object {
        val gson = Gson()

        @TypeConverter fun detailsToString(details: List<Details>): String {
            return gson.toJson(details)
        }

        @TypeConverter fun stringtoDetails(value: String): List<Details> {
            val type = object : TypeToken<List<Details>>() {}.type
            return gson.fromJson(value, type)
        }
    }
}

Просто для завершения моего вопроса, вот моя реализация RoomDatabase:

@Database(
    entities = [CurrentWeatherResponse::class,Coord::class,Main::class,Sys::class,Wind::class,Details::class],
    version = 1
)
@TypeConverters(DetailTypeConverters::class)
abstract class ForecastDatabase: RoomDatabase() {
    abstract fun currentWeatherDao(): CurrentWeatherDao

    companion object {
        @Volatile private var instance: ForecastDatabase? = null
        private var LOCK = Any()

        operator fun invoke(context: Context) = instance ?: synchronized(LOCK) {
            instance ?: buildDatabase(context).also { instance = it }
        }

        private fun buildDatabase(context: Context) =
            Room.databaseBuilder(context.applicationContext, ForecastDatabase::class.java, "forecast.db")
                .build()
    }
}

Следуя этому подходу, я получаю следующую ошибку при сборке приложение:

C:\Users\Spark\SimpleWeather\app\build\tmp\kapt3\stubs\debug\com\a5corp\weather\data\network\response\current\CurrentWeatherResponse.java:14: error: Cannot figure out how to save this field into database. You can consider adding a type converter for it.
    private final com.a5corp.weather.data.network.response.current.Detail details = null;

Даже я подозревал, что что-то не так, потому что в моей IDE не отображаются функции внутри DetailTypeConverters, которые можно было бы использовать где-либо вообще. Например:

IDE not recognizing the functions maybe

Я знаю, что многие в прошлом также публиковали решения для подобных проблем в StackOverflow. Я попробовал много из них и попытался приспособиться к тому, что я хотел. Решения, которые я опробовал:

У каждого из них была та же проблема - то же самое сообщение об ошибке, как отправлено выше, было брошено, собирая приложение. Кроме того, в каждом написанном мной решении TypeConverter два метода внутри всегда будут показывать выделение неиспользуемого в моей Android Studio.

Я также рассматриваю возможность перехода в Realm (если это может сделать все проще), но мне бы очень хотелось изучить все возможности, чтобы сделать эту работу.

1 Ответ

0 голосов
/ 10 января 2020

Изменение List<Details> в ArrayList<Details> как в Entity, так и в классе Type Converter решило эту проблему для меня.

...