База данных номеров без учета преобразователя типов

У меня есть такой класс 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, и я определил его, но все же получаю сообщение об ошибке. Что я здесь делаю не так? Спасибо

1
0
393
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам не нужен NewsConverter. Вам не нужен NewsResponse как Entity. ваши сущности должны быть такими:

@Database(entities = arrayOf(Source::class,NewsItem::class),version = 1)
abstract class SourceDataBase : RoomDatabase(){

и тогда все должно работать нормально

и ArrayList не может быть первичным ключом

Aleks Sander 11.07.2018 10:37

Да, ты прав. Похоже, то, что пытается сделать OP, противоречит здравому смыслу. Room уже умеет помещать объект в список, конвертер не нужен.

Zun 11.07.2018 10:38

Другие вопросы по теме