微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何正确制作转换器类?

如何解决如何正确制作转换器类?

我有来自 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 举报,一经查实,本站将立刻删除。