gson 房间未检测到@类型转换器

dced5bon  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(156)

这是我唯一的实体:

@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符号移到任何可能的地方,但问题仍然存在

lsmd5eda

lsmd5eda1#

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

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

相关问题