如何为最简单的自定义数据类创建类型转换器

问题描述 投票:0回答:1

所以我正在努力理解如何为妥协 2 个字符串的自定义类创建一个简单的类型转换器,以便我可以将它与 Room db 一起使用。我读到的没有任何意义。

我的 Converter 类将是什么样子来处理 MoreStrings 并解决 str3 错误:无法弄清楚如何将此字段保存到数据库中。可以考虑为其添加一个类型转换器

data class MyString ( 
   val str1: String = "",
   val str2: String = "",
   val str3: MoreStrings
) : Serializable

data class MoreStrings (
   val str4: String = "",
   val str5: String = ""
) : Serializable 
android kotlin android-room typeconverter
1个回答
0
投票

需要类型转换器是因为 SQLite(Room 所围绕的数据库)如何以有限数量的类型(存储类型)INTEGER、REAL、TEXT、BLOB 和 NULL 存储数据。

Room 可以确定将哪种存储类型用于更大但仍预定义的类型集。 Int、Long、Byte、Boolean .... 作为 INTEGER、Float、Double .... 作为 REAL、ByteArray .... 作为 BLOB 和 String 作为 TEXT。

当保存不是预定义类型的对象时,可以将该对象作为单个值保存在合适的存储类中,并且还能够提取数据。因此使用 TypeConverters 以及使用它们的建议。

在您的情况下,假设 MyString 被

@Entity
注释,因此每个字段都保存为表中的一列。然后 str1 和 str2 不需要什么特殊的,因为值是字符串并且可以存储为 TEXT。

但是,str3 是 MyString 的一种类型,因此不是预定义类型。

因此需要一种方法来将 MyString 存储为单个列或将 MyString 拆分为更多列。

首先是 TypeConvereters 发挥作用的地方。它们必须成对出现,一个将对象转换为单个值,以便将数据存储在数据库中。另一个是从单个值构建对象以从数据库中检索数据。

作为 MoreStrings 的一个例子(一个简单的例子),您可以有一个类型转换器,它可以简单地将 str4 和 str5 连接成一个带有合适分隔符的字符串,从而允许将单个字符串拆分为构建 MoreStrings 所需的 2 个字符串对象。

例如你可以有:-

class MyTypeConverter {
    @TypeConverter
    fun convertFromMoreStringsToString(moreStrings: MoreStrings): String {
        return moreStrings.str4 + "::" + moreStrings.str5
    }
    @TypeConverter
    fun convertToMoreStringsFromString(stringFromDB: String) : MoreStrings {
        val split = stringFromDB.split("::")
        return MoreStrings(split[0],split[1])
    }
}
  • 注意,这是为了演示原理,实际上并不是一个好的转换器,因为如果其中一个字符串包含 :: ,那么就会导致问题。
  • 注意单数
    @TypeConverter
    注释。

房间必须了解转换器才能使用它们。要将转换器定义为 Room,请使用

@TypeConverters
注释(注意复数),并将类指定为注释的 varargs 参数。

例如对于上述内容,您可以:-

@TypeConverters(MyTypeConverter::class)
  • 需要注意的是,注释的位置决定了范围。最大范围是当注释放置在
    @Database
    级别时。

通常,当您经常处理对象时,GSON 库用于将对象与 JSON 字符串相互转换。

事实上不需要TypeConverters,底层数据总是可以分解为可以作为一个存储的数据。

@Embedded
注释可用于将对象的字段嵌入为单独的列,例如你可以有:-

@Entity
data class MyOtherString(
    @PrimaryKey
    val stra: String = "",
    val strb: String = "",
    @Embedded
    val strc: MoreStrings
)
  • 在这种情况下,不需要类型转换器,因为每个值都是一列,例如Room 将使用
    CREATE TABLE IF NOT EXISTS 
    MyOtherString
     (
    stra
    TEXT NOT NULL,
    strb
    TEXT NOT NULL,
    str4
    TEXT NOT NULL,
    str5
     TEXT NOT NULL, PRIMARY KEY(
    stra
    ))
    创建表格,即列 str4 和 str5 用于嵌入的 MoreStrings 对象。
© www.soinside.com 2019 - 2024. All rights reserved.