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

Я разрабатываю новостное приложение и получаю следующее сообщение об ошибке: Не могу понять, как сохранить это поле в базе данных. Вы можете рассмотреть возможность добавления конвертера типов для него. приватный финал *

ниже Article.kt

@Entity(tableName = "article")

    data class Article(
        @ColumnInfo(name = "author") val author: String,
        val content: String,
        val description: String,
        var publishedAt: String,
        val source: Source,
        val title: String,
        val url: String,
        val urlToImage: String
    )

ниже Source.kt

data class Source(
    val id: Any?,
    val name: String
) {

}

ниже SourceTypeConverters.kt, где я пытаюсь выполнить преобразование

object SourceTypeConverters {
    @TypeConverter
    fun ConvertSource(source: Source?): String? {
        return source?.toString()
    }

    @TypeConverter
    fun ConvertSource(source: String?): Source? {
        return source?.let { Source(it) }
    }
}

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

1 Ответ

0 голосов
/ 02 апреля 2020

typeConvertor, похоже, немного не работает. Вместо объекта пусть это будет класс. Сохранить в БД как JSON строку и извлечь ее (библиотека GSON необязательно).

class SourceTypeConverter {
    @TypeConverter
    fun fromSource(source: Source): String {
        return JSONObject().apply { 
            put("id", source.id)
            put("name", source.name)
        }.toString()
    }

    @TypeConverter
    fun toSource(source: String): Source {
        val json = JSONObject(source)
        return Source(json.get("id"), json.getString("name"))
    }
}

Теперь зарегистрируйте этот преобразователь типов в базе данных с аннотацией TypeConverter.

@Database(entities = [Article::class], version = 1, exportSchema = false)
@TypeConverters(SourceTypeConverter::class)
abstract class SportNewsDatabase : RoomDatabase() {
      /* your code here */
}
...