Room TypeConverter类无法编译



我正试图将Room TypeConverter(Room 2.2.5版本(用于枚举,但在编译时我收到了一个Class is referenced as a converter but it does not have any converter methods.。查看Converter.java类,它确实缺少我定义的转换器方法。我已经将渐变中的annotationProcessorOptions设置为"room.incremental":"true"。以前有人遇到过这个问题吗?

enum class Exposure(val label: String) {
SUN("Sun"),
PARTIAL_SUN("Partial sun"),
SHADE_PARTIAL_SUN("Shade, Partial sun"),
SHADE("Shade"),
SHADE_SUN("Shade, Sun");
companion object {
fun labels(): List<String> {
return values().map { it.label }.toList()
}
}
}
class Converters {
@TypeConverter
fun toExposure(value: String): Exposure {
return value.let { Exposure.valueOf(it) }
}
@TypeConverter
fun fromExposure(exposure: Exposure): String {
return exposure.name
}
}
@Entity(tableName = "plant")
data class PlantEntity(
var name: String,
var exposure: Exposure
) {
@PrimaryKey(autoGenerate = true)
var id: Int = 0
}
@Database(entities = [PlantEntity::class], version = 1, export = false)
@TypeConverters(Converters::class)
abstract class PlantDatabase : RoomDatabase() {
abstract fun plantDao(): PlantDao
...
}

我也遇到过这个问题,在编译的java代码中找不到我的枚举。

这是因为我把枚举放在了一个名为enum的包中。这是不允许的,因为它是一个保留关键字,所以我将包重命名为enums。也许您也做过类似的事情,即您创建了一个具有非法名称的包。

另一方面,您链接的网站显示,Room 2.3及以上版本包含一个用于持久化枚举的默认类型转换器。

您可以尝试使用对象和@JvmField

object Converters {
@TypeConverter
@JvmStatic
fun toExposure(value: String): Exposure =
value.let { Exposure.valueOf(it) }

@TypeConverter
@JvmStatic
fun fromExposure(exposure: Exposure): String =
exposure.name
}

使用这个转换器类:

class ListConverter {
@TypeConverter
fun fromList(list : List<Object>): String {
return Gson().toJson(list)
}
@TypeConverter
fun toList(data : String) :  List<Object> {
if (data == null){
return Collections.emptyList()
}
val typeToken = object : TypeToken< List<Object>>() {}.type
return Gson().fromJson(data,typeToken)
}
}

最新更新