【问题标题】:How to make a converter class correctly?如何正确制作转换器类?
【发布时间】:2021-03-10 13:21:28
【问题描述】:

我有来自 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.

【问题讨论】:

    标签: android kotlin android-room typeconverter


    【解决方案1】:

    @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&lt;Result&gt; 映射到 String,反之亦然。

    【讨论】:

    • 好的,谢谢!我的数据库仍然不明白如何将此类保存到数据库中...错误:无法弄清楚如何将此字段保存到数据库中。您可以考虑为其添加类型转换器。私有最终 java.util.List 结果 = null;您可能需要更改转换器类本身
    • 您必须为List&lt;Result&gt; 添加一个转换器类,而不仅仅是Result。不幸的是,你必须自己处理这个逻辑!
    • 非常感谢!你很有帮助
    • 我将编辑我的答案以确保它都在一个地方
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多