【问题标题】:Room doesn't detect @Typeconverters房间没有检测到@Typeconverters
【发布时间】:2021-02-25 01:15:08
【问题描述】:

这是我唯一的实体:

    @Entity(tableName = "sticker_packs")
    class StickerPack(
        @PrimaryKey(autoGenerate = true)
        val identifier: Int = 0,
        var name: String,
        var publisher: String,
        @TypeConverters(StickerConverter::class)
        private var stickers: List<Sticker> = emptyList())

这是我的自定义 Sticker 类:

    data class Sticker(
    val emojis: List<String>,
    var imageDir: String,
    var size: Long = 0L)

这是我的数据库类:

@Database(entities = [StickerPack::class], version = 1)
//I get this same error with or without my Typeconverters here
@TypeConverters(StickerConverter::class)
abstract class StickerPacksDatabase: RoomDatabase() {

    abstract val stickerPacksDao: StickerPacksDao

    companion object{
        @Volatile
        private var INSTANCE: StickerPacksDatabase? = null

        fun getInstance(context: Context): StickerPacksDatabase{
            synchronized(this){
                var instance = INSTANCE
                if(instance == null){
                    instance =
                        Room.databaseBuilder(context.applicationContext, StickerPacksDatabase::class.java, "sticker_packs_database")
                            .build()
                    INSTANCE = instance
                }
                return instance
            }
        }
    }
}

这是我的typeconverter

    class StickerConverter {
    @TypeConverter
    fun stickersToJson(stickers: List<Sticker>): String = Gson().toJson(stickers)
    @TypeConverter
    fun jsonToStickers(json: String): List<Sticker> = Gson().fromJson(json)

    private inline fun <reified T> Gson.fromJson(json: String): T = fromJson(json, object: TypeToken<T>() {}.type)}

我并不想做任何花哨的事情,只是使用 Gson 将列表转换为字符串,但是在尝试构建项目时,我收到以下错误:

无法弄清楚如何将此字段保存到数据库中。你可以考虑为它添加一个类型转换器。

但这正是我想要做的。我可能在某个地方犯了错误,但我似乎找不到它。我尝试将@TypeConverters 符号移动到任何可能的地方,但问题仍然存在

【问题讨论】:

    标签: android kotlin gson android-room


    【解决方案1】:

    您需要将@TypeConverters 注释添加到AppDatabase 类,以便Room 可以使用您在AppDatabase 中为每个实体和DAO 定义的转换器:

    Database(entities = arrayOf(Sticker::class), version = 1)
    @TypeConverters(StickerConverter::class)
    abstract class AppDatabase : RoomDatabase{
    }
    

    【讨论】:

    • 我试过了,但不幸的是我仍然收到同样的错误信息。我用我的数据库类更新了问题
    • 您正在尝试将Sticker 的列表保存到数据库中,而您可以在StickerPackSticker 之间创建一对多的关系。对吗?
    猜你喜欢
    • 1970-01-01
    • 2022-11-11
    • 2015-04-27
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 2019-07-09
    • 2012-10-10
    相关资源
    最近更新 更多