У меня есть такой класс Entity
@Entity
data class NewsResponse(
@PrimaryKey
@field:SerializedName("news")
val news: ArrayList<NewsItem?>? = null
)
Класс NewsItem выглядит так
@Entity
data class NewsItem(
@field:SerializedName("imgUrl")
val imgUrl: String? = null,
@field:SerializedName("link")
val link: String? = null,
@field:SerializedName("description")
val description: String? = null,
@PrimaryKey
@field:SerializedName("title")
val title: String? = null
)
Затем у меня есть DAO для NewsResponse, как это
@Dao
interface NewsRespDao {
@Query("SELECT * FROM NewsItem")
fun getNewsItems():LiveData<List<NewsItem>>
@Insert(onConflict = REPLACE)
fun insertNews(newsList: List<NewsItem?>?)
@Query("DELETE FROM NewsItem")
fun deleteAll()
}
У меня также есть TypeConverter, определенный следующим образом
class NewsConverter {
@TypeConverter
fun fromString(value:String):ArrayList<NewsItem>{
val listType = object : TypeToken<ArrayList<NewsItem>>() {
}.type
return Gson().fromJson(value, listType)
}
fun fromArrayList(list:ArrayList<NewsItem>):String{
val gson = Gson()
return gson.toJson(list)
}
}
Затем в классе RoomDatabase я определил аннотацию TypeConverter следующим образом
@Database(entities = arrayOf(Source::class,NewsResponse::class),version = 1)
@TypeConverters(NewsConverter::class)
abstract class SourceDataBase : RoomDatabase(){
abstract fun sourceDao():SourceDao
companion object {
private var INSTANCE:SourceDataBase?=null
fun getInstance(context: Context):SourceDataBase?{
if (INSTANCE == null){
synchronized(SourceDataBase::class){
INSTANCE = Room.databaseBuilder(context.applicationContext,SourceDataBase::class.java,"source.db")
.build()
}
}
return INSTANCE
}
fun destroyInstance(){
INSTANCE=null
}
}
}
Но всякий раз, когда я пытаюсь бежать, я получаю сообщение об ошибке
Cannot figure out how to save this field into database. You can consider adding a type converter for it.
Один из способов сохранить список объектов - определить TypeConverter, и я определил его, но все же получаю сообщение об ошибке. Что я здесь делаю не так? Спасибо
Вам не нужен NewsConverter. Вам не нужен NewsResponse как Entity. ваши сущности должны быть такими:
@Database(entities = arrayOf(Source::class,NewsItem::class),version = 1)
abstract class SourceDataBase : RoomDatabase(){
и тогда все должно работать нормально
Да, ты прав. Похоже, то, что пытается сделать OP, противоречит здравому смыслу. Room уже умеет помещать объект в список, конвертер не нужен.
и ArrayList не может быть первичным ключом