如何解决如何正确制作转换器类?
我有来自 API 的 POJO 数据类。
@Entity(tableName = "pokemon")
class Pokemon(
@PrimaryKey(autoGenerate = true)
var id: Int? = null,@Serializedname("count")
@Expose
val count: Int?,@Serializedname("next")
@Expose
val next: String?,@Serializedname("results")
@Expose
val results: List<Result>? = null
)
和类列表:
class Result(
@Serializedname("name")
@Expose
val name: String?,@Serializedname("url")
@Expose
val url: String?
)
我的数据库类:
@Database(entities = [Pokemon::class],version = 1,exportSchema = false)
@TypeConverters(Converters::class)
abstract class AppDatabase : RoomDatabase() {
companion object {
private var db: AppDatabase? = null
private const val DB_NAME = "main.db"
private val LOCK = Any()
fun getInstance(context: Context): AppDatabase {
synchronized(LOCK) {
db?.let { return it }
val instance = Room.databaseBuilder(
context,AppDatabase::class.java,DB_NAME
)
.fallbackToDestructiveMigration()
.build()
db = instance
return instance
}
}
}
abstract fun PokemonDao(): PokemonDao
}
我的类转换器:
class Converters {
@TypeConverters
fun fromresultToString(result: slode.elsloude.pokemonapi.pojo.Result?): String? {
return Gson().toJson(result)
}
@TypeConverters
fun fromStringToResult(value: String?): slode.elsloude.pokemonapi.pojo.Result? {
return Gson().fromJson(value,Result::class.java)
}
}
我在尝试时遇到的错误是:
error: Class is referenced as a converter but it does not have any converter methods. - androidx.databinding.adapters.ConvertersC:\Users\elslode\.AndroidStudio3.6\PokemonApi\app\build\tmp\kapt3\stubs\debug\slode\elsloude\pokemonapi\pojo\Pokemon.java:22: error: Cannot figure out how to save this field into database. You can consider adding a type converter for it.
private final java.util.List<slode.elsloude.pokemonapi.pojo.Result> results = null;
^C:\Users\elslode\.AndroidStudio3.6\PokemonApi\app\build\tmp\kapt3\stubs\debug\slode\elsloude\pokemonapi\pojo\SinglePokemon.java:14: error: Cannot figure out how to read this field from a cursor.
解决方法
@TypeConverters
注释用于将您的转换器与数据库链接,正如您在此处所做的那样:
@TypeConverters(Converters::class)
但是,在声明转换器方法时,您应该使用 @TypeConverter
注释:
class Converters {
@TypeConverter
fun fromResultToString(result: slode.elsloude.pokemonapi.pojo.Result?): String? {
return Gson().toJson(result)
}
@TypeConverter
fun fromStringToResult(value: String?): slode.elsloude.pokemonapi.pojo.Result? {
return Gson().fromJson(value,Result::class.java)
}
}
注意 @TypeConverters
与 @TypeConverter
的复数形式。
第二,Room 无法自动为您推断列表转换,因此类型转换器函数必须将完整的 List<Result>
映射到 String
,反之亦然。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。