Итак, в моем коде я получаю список строк, которые соответствуют жанрам mov ie в перечислении. Затем я получаю файл метаданных и просматриваю каждый из этих жанров, чтобы узнать, является ли дата, когда сервер обновил этот жанр, новее, чем дата, когда я извлек эти фильмы и сохранил их в базе данных. Короче говоря, в файле метаданных есть классы для каждого из жанров, и я делаю ТОНА повторения, просто потому, что не могу придумать, как программно сообщить своему приложению, что, например, если вы оцениваете жанр ACTION, вам следует взглянуть на переменную-член metadata.action. Вот мой код, я его урезал, но есть пара десятков жанров.
TwMetadata
data class TwMetadata (
@SerializedName("action") var action : Action,
@SerializedName("adventure") var adventure : Adventure,
@SerializedName("animation") var animation : Animation,
@SerializedName("comedy") var comedy : Comedy,
)
В следующем коде я взял список строк, которые я извлек с сервера, преобразовал их в перечисления жанров, и я проверяю дату последнего обновления в файле метаданных sharedpreferences (spObj), по сравнению с датой последнего обновления в недавно извлеченном файле метаданных (metadata.value). Если появляются новые данные, я изменяю дату в файле метаданных sharedpreferences, который я фиксирую в конце этого завершаемого файла. Затем я отправляю его функции, которая извлекает данные из базы данных или из Интернета, в зависимости от значения логического значения, которое я отправляю. В идеале я мог бы избавиться от всего этого блока «когда» и просто запустить одну функцию для каждого жанра, но для этого им нужно было бы знать, какому классу они соответствуют в файле метаданных.
private fun checkGenreDate(genreList: MutableList<GENRE>) : Completable {
return Completable.create { emitter ->
var getNew = json.isNullOrEmpty()
genreList.forEach {
when (it) {
GENRE.NULL -> {
}
GENRE.ACTION -> {
if (spObj.action.updated < metadata.value!!.action.updated) {
getNew = true
spObj.action = metadata.value!!.action
}
loadFromTwApi(it, getNew)
}
GENRE.ADVENTURE -> {
if (spObj.adventure.updated < metadata.value!!.adventure.updated) {
getNew = true
spObj.adventure = metadata.value!!.adventure
}
loadFromTwApi(it, getNew)
}
GENRE.ANIMATION -> {
if (spObj.animation.updated < metadata.value!!.animation.updated) {
getNew = true
spObj.animation = metadata.value!!.animation
}
loadFromTwApi(it, getNew)
}
GENRE.COMEDY -> {
if (spObj.comedy.updated < metadata.value!!.comedy.updated) {
getNew = true
spObj.comedy = metadata.value!!.comedy
}
loadFromTwApi(it, getNew)
}
GENRE.RANDOM -> {
}
GENRE.THEATER -> {
loadTheaterData()
}
}
}
emitter.onComplete()
}
}
мой перечислимый класс
enum class GENRE {
NULL,
ACTION,
ADVENTURE,
ANIMATION,
COMEDY,
RANDOM,
THEATER;
companion object {
fun getGenreByName(name: String) = try {
(name.toUpperCase(Locale.getDefault()))
} catch (e: IllegalArgumentException) {
null
}
}