当前位置: 首页 > 知识库问答 >
问题:

TypeConverters无法知道如何将此字段保存到数据库中

孙嘉
2023-03-14
object OtherServicesTypeConverter {
    private val gson = Gson()
    @TypeConverter
    @JvmStatic
    fun stringToList(data: String?): List<Map<String, OtherServiceEntity>> {
        if (data == null) {
            return Collections.emptyList()
        }

        val listType = object : TypeToken<List<Map<String, OtherServiceEntity>>>() {

        }.type

        return gson.fromJson<List<Map<String, OtherServiceEntity>>>(data, listType)
    }

    @TypeConverter
    @JvmStatic
    fun listToString(objects: List<Map<String, OtherService>>): String {
        return gson.toJson(objects)
    }
}
@Entity(tableName = "ProfileEntities")
    data class ProfileEntity(
            @PrimaryKey
            @SerializedName("masterId") var masterId: Long = 0,
            @SerializedName("nickname") var nickname: String = "",
            @TypeConverters(OtherServicesTypeConverter::class)
            @SerializedName("otherServices") var otherServices: List<Map<String, OtherServiceEntity>>,
            @Embedded
            @SerializedName("images") var images: ProfileImagesEntity = ProfileImagesEntity(),
            @SerializedName("updatedAt") var updatedAt: String = ""
    )


 @Database(entities = [ArticleFeatureEntity::class, ProfileEntity::class], version = 3)
    @TypeConverters(DataTypeConverter::class, ProfileTypeConverter::class, OtherServicesTypeConverter::class)
    abstract class AppDatabase : RoomDatabase() {
        abstract fun profileDao(): ProfileDao
        // Code here


    }

请大家帮忙支持我,谢谢!

共有1个答案

慕容劲
2023-03-14

最后,我认识到Room需要在类型转换器实现中进行一些特殊的更改(更改为ArrayList > )。不过,我不知道这是一个功能或错误,因为其他情况下我仍然可以使用列表作为类型。这是我所做的细节,现在我可以运行它了

@Entity(tableName = "ProfileEntities")
data class ProfileEntity(
        @TypeConverters(ProfileTypeConverter::class)
        @SerializedName("details") var details: List<ProfileDetailEntity> = listOf(),
        @Embedded
        @SerializedName("images") var images: ProfileImagesEntity = ProfileImagesEntity(),
        @PrimaryKey
        @SerializedName("masterId") var masterId: Long = 0,
        @TypeConverters(OtherServicesTypeConverter::class)
        @SerializedName("otherServices") var otherServices: ArrayList<HashMap<String, OtherServiceEntity>> = arrayListOf(),
        @SerializedName("updatedAt") var updatedAt: String = ""
)

和转换器的实现

class ProfileTypeConverter {
    private val gson = Gson()
    @TypeConverter
    fun stringToList(data: String?): List<ProfileDetailEntity> {
        if (data == null) {
            return Collections.emptyList()
        }

        val listType = object : TypeToken<List<ProfileDetailEntity>>() {

        }.type

        return gson.fromJson<List<ProfileDetailEntity>>(data, listType)
    }

    @TypeConverter
    fun listToString(someObjects: List<ProfileDetailEntity>): String {
        return gson.toJson(someObjects)
    }
}

class OtherServicesTypeConverter {
    private val gson = Gson()
    @TypeConverter
    fun stringToList(data: String?): ArrayList<HashMap<String, OtherServiceEntity>> {
        if (data == null) {
            return ArrayList()
        }

        val listType = object : TypeToken<ArrayList<HashMap<String, OtherServiceEntity>>>() {

        }.type

        return gson.fromJson<ArrayList<HashMap<String, OtherServiceEntity>>>(data, listType)
    }

    @TypeConverter
    fun listToString(objects: ArrayList<HashMap<String, OtherServiceEntity>>): String {
        return gson.toJson(objects)
    }
}

快乐编码!

 类似资料:
  • 我需要你的帮助。我试图在没有反序列化的情况下找到解决方案,但我什么也没找到。如果你能帮我就好了...所以我有了下面的JSON文件 谢谢你的时间和帮助。 我有以下错误:

  • 我试图创建Room数据库并向其插入值,但我得到了这个错误: 公共抽象类WeatherDatabase扩展了AndroidX.Room.RoomDatabase{^error:无法知道如何将此字段保存到数据库中。可以考虑为它添加类型转换器。AndroidX.Room.RoomDatabaseError中的-mDatabase:无法确定如何将此字段保存到数据库中。可以考虑为它添加类型转换器。Andro

  • 问题内容: 详细日志 我有一个实体,其字段为 为什么房间不能保留日期对象?什么是Date的最佳转换器? 问题答案: 正是https://developer.android.com/training/data-storage/room/referencing- data中 给出的示例。 例如,如果要保留Date的实例,可以编写以下TypeConverter来将等效的Unix时间戳存储在数据库中: 前

  • 这是使用电子邮件密码注册帐户的所有代码,保存验证电子邮件,将用户数据保存到Firestore数据库中。只有Firestore数据库无法运行。 else { Toast.makeText(register.this, “Error ! ” task.getException().getMessage(), Toast.LENGTH_SHORT).show();progressBar.setVisib

  • 我正在尝试在我的设计表单上添加一个额外的字段,如下所示: 我必须允许额外的字段,所以我创建了一个新的初始值设定项devise_permitted_parameters.rb,如下所示 输出如下: "email"=? LIMIT?[["email","wtgwg@gmail.com "], ["LIMIT",1]]SQL(1.1ms)插入到"用户"("email","encrypted_passwo

  • 所以,当我试图编译它时,我得到了这个错误: 我不熟悉房间实施,所以我不知道如何解决这个问题。