所以我正在努力理解如何为妥协 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
需要类型转换器是因为 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
)
CREATE TABLE IF NOT EXISTS
MyOtherString (
straTEXT NOT NULL,
strbTEXT NOT NULL,
str4TEXT NOT NULL,
str5 TEXT NOT NULL, PRIMARY KEY(
stra))
创建表格,即列 str4 和 str5 用于嵌入的 MoreStrings 对象。